В PowerShell, как мне преобразовать DateTime в UNIX?

В PowerShell, как я могу преобразовать строку DateTime в сумму секунд?

Ответ 1

PS H:\> (New-TimeSpan -Start $date1 -End $date2).TotalSeconds

1289923177.87462

New-TimeSpan может быть использован для этого. Например,

$date1 = Get-Date -Date "01/01/1970"
$date2 = Get-Date
(New-TimeSpan -Start $date1 -End $date2).TotalSeconds

Или просто используйте эту однострочную команду

(New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds

Ответ 2

Как уже упоминалось, эпоха UNIX - 1 января 1970 года в 12:00 (полночь) UTC. Чтобы получить текущую секундную-в-эпоху в UTC в целом номере, я использую этот 80-символьный однострочный

$ED=[Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat "%s"))

Приведенный выше код совместим с PowerShell 2.0 и округляет его (для обеспечения согласованного поведения с UNIX)

Ответ 3

С .NET Framework 4.6 вы можете использовать ToUnixTimeSeconds метод DateTimeOffset class:

[DateTimeOffset]::Now.ToUnixTimeSeconds()

$DateTime = Get-Date #or any other command to get DateTime object
([DateTimeOffset]$DateTime).ToUnixTimeSeconds()

Ответ 4

Этот однострочный файл работает для меня (сравнил его с http://www.unixtimestamp.com/)

[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalSeconds

В течение миллисекунд

[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds

Ответ 5

Чтобы получить секунды с 1970 года независимо от часового пояса, я бы пошел с:

$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
[int]([DateTime]::UtcNow - $unixEpochStart).TotalSeconds

Ответ 6

Я просто хотел представить еще один, и, надеюсь, более простой способ решить эту проблему. Вот один вкладыш, который я использовал для получения текущего времени Unix (эпоха) в UTC:

$unixTime = [long] (Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s)

Разрушая это изнутри:

(Get-Date).ToUniversalTime()

Получает текущую дату/время в часовом поясе UTC. Если вы хотите по местному времени, просто позвоните в Get-Date. Затем он используется как вход для...

[long] (Дата-дата-дата (дата/время UTC сверху) -UFormat% s)

Преобразование даты/времени UTC (с первого шага) в формат Unix. -UFormat% s сообщает Get-Date, чтобы вернуть результат как время эпохи Unix (секунды, прошедшие с 01 января 1970 года 00:00:00). Обратите внимание, что это возвращает двойной тип данных (в основном десятичный). Бросив его на длинный тип данных, он автоматически преобразуется (округляется) в 64-разрядное целое (без десятичной). Если вам нужна дополнительная точность десятичной дроби, не отбрасывайте ее на длинный тип.

Дополнительный кредит

Другой способ конвертировать/округлять десятичное число до целого числа - использовать System.Math:

[System.Math]::Round(1485447337.45246)

Ответ 7

Powershell

$epoch = (Get-Date -Date ((Get-Date).DateTime) -UFormat %s)

Ответ 8

Я предлагаю следующее, основанное на тиках (Int64), а не секундах (Int32), чтобы избежать проблемы 2038 года. [Math]:: Floor используется, поскольку время Unix основано на количестве целых секунд с момента эпохи.

[long][Math]::Floor((($DateTime.ToUniversalTime() - (New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc))).Ticks / [timespan]::TicksPerSecond))

Ответ 9

Здесь script, который преобразует как TO, так и FROM CTIME, которые я использовал некоторое время (дольше, потому что он был написан для толпы типа "новый для сценариев" с различными комментариями.

# Here a very quick variant to 'get the job done'
[Int]$ctime=1472641743
[datetime]$epoch = '1970-01-01 00:00:00'
[datetime]$result = $epoch.AddSeconds($Ctime)

write-host $result

# A few example values for you to play with:
# 1290100140 should become ... 2010-11-18 17:09:00.000
# 1457364722 should become ... 2016-03-07 15:32:02.000
# 1472641743 should become ... 31/08/2016 11:09:03

# For repeated use / calculations, functions may be preferable. Here they are.

# FROM C-time converter function
# Simple function to convert FROM Unix/Ctime into EPOCH / "friendly" time
function ConvertFromCtime ([Int]$ctime) {
    [datetime]$epoch = '1970-01-01 00:00:00'    
    [datetime]$result = $epoch.AddSeconds($Ctime)
    return $result
}

# INTO C-time converter function
# Simple function to convert into FROM EPOCH / "friendly" into Unix/Ctime, which the Inventory Service uses.
function ConvertToCTime ([datetime]$InputEpoch) {
    [datetime]$Epoch = '1970-01-01 00:00:00'
    [int]$Ctime = ""

    $Ctime = (New-TimeSpan -Start $Epoch -End $InputEpoch).TotalSeconds
    return $Ctime
}

Надеюсь, что это поможет, особенно если вы просто хотите что-то более дружелюбное для начинающих или так:).

Ответ 10

Ниже cmdlet преобразует время безотказной работы Windows в формат понятной эпохи Unix:

   $s=Get-WmiObject win32_operatingsystem | select csname,@{LABEL='LastBootUpTime';EXPRESSION{$_.ConverttoDateTime($_.lastbootuptime)}};
   [Math]::Floor([decimal](Get-Date($s.LastBootUpTime.ToUniversalTime()).ToUniversalTime()-uformat "%s"))

Ответ 11

Снова по сравнению с http://www.unixtimestamp.com и построим на других выше

$date1 = (Get-Date -Date "01/01/1970").ToUniversalTime()
$date2 = (Get-Date).ToUniversalTime()
$epochTime = [Math]::Floor((New-TimeSpan -Start $date1 -End $date2).TotalSeconds)

Ответ 12

Этот должен также работать, поскольку javascript использует миллисекунды с эпохи:

ConvertTo-Json (Get-Date) | ? { $_ -Match '\(([0-9]+)\)' } | % { $Matches[1]/1000 }

Шаг за шагом:

PS P:\> Get-Date

lundi 15 janvier 2018 15:12:22


PS P:\> ConvertTo-Json (Get-Date)
{
    "value":  "\/Date(1516025550690)\/",
    "DisplayHint":  2,
    "DateTime":  "lundi 15 janvier 2018 15:12:30"
}

PS P:\> (ConvertTo-Json (Get-Date)) -Match '\(([0-9]+)\)'
True
PS P:\> $Matches

Name                           Value
----                           -----
1                              1516025613718
0                              (1516025613718)

Ответ 13

не уверен, когда -uformat был добавлен к get-date, но он позволяет вам использовать строки формата даты Unix;

[int64](get-date -uformat %s)

Ответ 14

Вы можете использовать параметр Uformat get-date. Но сначала я хотел бы убедиться, что дата данной рабочей станции правильная (я считаю, что рабочая станция подключена к сети компании, в которой есть сервер с правильным установленным временем).

#Synchronize workstation time with server
cmd /c "sc config w32time start= auto"
cmd /c "w32tm /unregister"
cmd /c "w32tm /register"
cmd /c "net start w32time"
cmd /c 'tzutil.exe /s "W. Europe Standard Time"'
cmd /c 'reg add "HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v DisableAutoDaylightTimeSet /t REG_DWORD /d 0 /f'  
cmd /c "net time \\full-servername.ru /set /yes"  

Затем я получаю фактическую временную метку Unix для сравнения объектов (учетных записей) между фактической датой и датой создания (задачи удаления учетной записи, когда временная метка Unix превышает предельную дату)

#Get actual unix timestamp and compare it to something
$actual_date = (get-date -UFormat "%s")
$final_date = "some unix date of the database"
if(($final_date - $actual_date) -lt 0 ){
#make deletion task
}