В PowerShell, как мне преобразовать DateTime во время UNIX? - PullRequest
12 голосов
/ 16 ноября 2010

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

Ответы [ 12 ]

22 голосов
/ 16 ноября 2010
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
19 голосов
/ 18 сентября 2014

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

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

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

16 голосов
/ 14 декабря 2015

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

[DateTimeOffset]::Now.ToUnixTimeSeconds()

$DateTime = Get-Date #or any other command to get DateTime object
([DateTimeOffset]$DateTime).ToUnixTimeSeconds()
14 голосов
/ 25 сентября 2015

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

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

за миллисекунды

[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds
6 голосов
/ 26 января 2017

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

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

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

(Get-Date) .ToUniversalTime ()

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

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

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

Extra credit

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

[System.Math]::Round(1485447337.45246)
6 голосов
/ 16 ноября 2010

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

$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
[int]([DateTime]::UtcNow - $unixEpochStart).TotalSeconds
4 голосов
/ 14 февраля 2018

Powershell

$epoch = (Get-Date -Date ((Get-Date).DateTime) -UFormat %s)
2 голосов
/ 26 января 2017

Вот скрипт, который преобразует и в и из CTIME, который я использовал некоторое время (дольше, потому что он был написан для толпы типа «новичок в скриптинге», с различными комментариями.

# 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
}

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

2 голосов
/ 15 июня 2015

Я предлагаю следующее, основанное на тиках (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))
0 голосов
/ 15 января 2018

Это также должно работать, так как 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...