В 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
}
надеюсь, что это поможет, особенно если вы просто хотите что-то немного дружелюбнее для новичков или так :).
ниже командлет преобразует время безотказной работы 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)