Я привык использовать .NET Framework DateTimeOffset
для получения секунд Unix.
PS> ([datetimeoffset] '2020-01-01').ToUnixTimeSeconds()
1577854800
Но я пишу сценарий PowerShell и подумал, что постараюсь быть как можно более «идиоматичным». Казалось, что Get-Date
поможет, но результаты другие.
PS> Get-Date -Date '2020-01-01' -UFormat %s
1577836800
Похоже, что Get-Date
является синонимом DateTime
, по умолчанию используется мой местный часовой пояс. Единственный способ получить дату в формате UTC от Get-Date
- это вызов другого метода .NET.
PS> (Get-Date -Date '2020-01-01').ToUniversalTime()
И теперь, чтобы получить секунды Unix, я снова могу трубить?
PS> (Get-Date -Date '2020-01-01').ToUniversalTime() | Get-Date -UFormat %s
Это ужасно много для того, что, как я думал, будет простым выражением ... какие-нибудь другие идеи?
Есть ли способ получить дату в формате UTC из Get-Date
а также, отформатировать вывод без трубопроводов? Нравится: (Get-Date).ToUniversalTime() | Get-Date -UFormat %s
Анализ верен - [DateTime]
неуказанного типа (будет местное время), но [DateTimeOffset]
- это UTC. Почему трубопровод имеет значение?
.NET Framework 4.6 или выше имеет DateTimeOffset.ToUnixTimeSeconds ()) - [DateTimeOffset]::Now.ToUnixTimeSeconds()
@kuujinbo - Прочтите первое предложение вопроса OP (вы можете удалить лишний комментарий)
@Bill_Stewart, это раздражает ?, и связывание одной даты получения с другой только для форматирования стало для меня сюрпризом, в надежде минимизировать удивление!
Без трубопроводов можно было бы работать с get-date ([datetime]'2020-01-01').ToUniversalTime() -UFormat %s
, но мне это кажется запутанным.
Имейте в виду, что PowerShell имеет проблемы с неправильным вычислением временных меток UNIX: "Временная метка UNIX" отличается в Windows и Linux, Некоторые исправления в Get-Date -UFormat.
Также - зачем вообще использовать секунды времени Unix? PowerShell может сравнивать объекты DateTime
(или DateTimeOffset
).
@Bill_Stewart Я пишу сценарий, который должен передавать данные в систему Linux, и работа с секундами Unix намного предпочтительнее (я знаю, что pwsh тоже кроссплатформенный, но последующая система не pwsh).
Итак, пока Get-Date
не станет зависимым от часового пояса или мы не получим новый командлет ... кажется, мы должны использовать метод ToUniversalTime
. Это особенно важно учитывать, потому что эта ошибка, кажется, влияет только на форматирование секунд Unix, если вы преобразовали нет в универсальное время (исправление объединено, но кто знает, в каком выпуске он находится).
Итак, Лучший, который мы можем сделать, вероятно, будет примерно таким:
PS> Get-Date -Date (Get-Date -Date '2020-01-01').ToUniversalTime() -UFormat %s
Только предположение, но я готов поспорить, что это разница в часовом поясе между вашим часовым поясом и UTC.