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

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

12 ответов


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

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

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

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


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

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

для МС

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

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

[DateTimeOffset]::Now.ToUnixTimeSeconds()

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

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

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

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

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

ломая это вниз изнутри:

(Get-Date).ToUniversalTime()

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

[длинный] (Get-Date-Date (UTC дата / время сверху) - UFormat %s)

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

дополнительно

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

[System.Math]::Round(1485447337.45246)

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

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

вот скрипт, который преобразует как в CTIME, так и из CTIME, который я использую некоторое время (дольше, потому что он был написан для толпы типов "new to scripting" с различными комментариями.

# Here's 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
}

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


Powershell

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

ниже командлет преобразует время безотказной работы 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"))

снова по сравнению с 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)

Это также должно работать, так как 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)