Мне нужно преобразовать вывод времени/даты UTC в стандартное восточное время в формате ISO 8601 (или аналогичном) с помощью Powershell для использования в пакетном файле DOS.
У меня очень мало опыта работы с Powershell, но я ранее модифицировал существующие команды Powershell для различных пакетных файлов DOS. Powershell может легко выводить время/дату из множества часовых поясов, но неясно, может ли он легко отображать этот вывод в числовом формате.
В пакетном файле DOS можно вызвать Powershell для отображения времени UTC в этом формате —
echo | powershell (get-date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss')
Мне нужно обратиться к другим часовым поясам, но вывод — «FullDateTimePattern», который прописан —
echo | Powershell [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time')
Я надеялся, что предыдущие команды могут (каким-то образом) быть объединены вместе, или если один из спецификаторов Get-Date -format может быть применен ко второму образцу кода, или если значение смещения может быть применено ко времени UTC/ вывод даты, или если есть какое-то другое простое кодовое решение (или утилита), которое я мог бы включить в пакетный файл DOS.
Просто добавьте часть с ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss')
в конец вашего второго примера.
Чтобы преобразовать текущее время UTC [datetime]
в восточное стандартное время в указанном формате:
powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([datetime]::UtcNow, 'Eastern Standard Time').ToString('yyyy-MM-ddTHH:mm:ss')"
Обратите внимание на следующие дополнительные улучшения:
Нет необходимости в echo |
: когда PowerShell вызывается командой с (возможно, подразумеваемой) -Command
/ -c
, он автоматически завершает работу после выполнения этой команды. (Кроме того, echo |
отправляет не просто новая линия, а отправляет строку ECHO is on.
, за которой следует новая строка; чтобы отправить только новую строку, вам нужно использовать echo. |
Вариант -c
(-Command
) используется явно, не только для того, чтобы прояснить намерение, но и для облегчения возможного последующего перехода на PowerShell Основной, где -Command
больше не используется по умолчанию (-File
есть).
Хотя ваша конкретная команда будет работать без закрывающих двойных кавычек ("..."
), обычно лучше использовать их, чтобы команды, включающие метасимвол cmd.exe
, например, &
, не ломались.
ОП сказал, что они хотят перейти с UTC на восточное время. ToUniversalTime
не следует использовать, так как это преобразует местное время в UTC. Я бы рекомендовал либо использовать версия ConvertTimeBySystemTimeZoneId
, состоящая из DateTime
и двух строк с "UTC"
и "Eastern Standard Time"
, либо использовать ConvertTimeFromUtc
.
Спасибо, @MattJohnson, хорошие указатели. Мне неясно, чего на самом деле хочет ОП, поэтому я упростил ответ, чтобы показать только одно конкретное преобразование.
@MattJohnson Не могли бы вы привести примеры кода для ConvertTimeBySystemTimeZoneID
и ConvertTimeFromUTC
преобразования текущего времени из UTC (или стандартного времени Лайн-Айлендс) в стандартное восточное время? (Если только для другого возможного решения вопроса).
Большое спасибо за полезные ответы. Я заметил, что таким образом можно применить задокументированные спецификаторы формата Microsoft Get-Date к часовым поясам (что не было очевидным, учитывая отсутствие у меня опыта работы с Powershell).
Может быть полезно протестировать большинство этих параметров в самых разных часовых поясах.
Стандартное время линии перемены дат [(UTC-12:00) Западная международная линия перемены дат]
Стандартное время островов Лайн [(UTC+14:00) острова Киритимати]
Следующий код был запущен в субботу, 1 июня 2019 г., в 13:01 по восточному стандартному времени для преобразования в стандартное время Лайн-Айлендс (UTC+14:00).
ShortDatePattern: эквивалент Get-Date -format d
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('d')"
02.06.2019
LongDatePattern: эквивалент Get-Date -format D
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('D')"
Воскресенье, 02 июня 2019 г.
Полная дата и время (длинная дата и короткое время): эквивалент Get-Date -format f
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('f')"
2 июня 2019 г., 7:01
FullDateTimePattern (длинная дата и долгое время): эквивалент Get-Date -format F
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('F')"
2 июня 2019 г., 7:01:23
Общие (короткая дата и короткое время): эквивалент Get-Date -format g
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('g')"
02.06.2019 7:01
Общие (короткая дата и долгое время): эквивалент Get-Date -format G
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('G')"
02.06.2019 7:01:25
MonthDayPattern: Get-Date -format m
или эквивалент Get-Date -format M
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('m')"
2 июня
Дата/время поездки туда и обратно: эквивалент Get-Date -format o
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('o')"
2019-06-02T07:01:27.8492082
RFC1123Pattern: Get-Date -format r
или эквивалент Get-Date -format R
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('r')"
вс, 02 июня 2019 г., 07:01:28 по Гринвичу
SortableDateTimePattern (на основе ISO 8601) с использованием местного времени: эквивалент Get-Date -format s
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('s')"
2019-06-02T07:01:29
ShortTimePattern: эквивалент Get-Date -format t
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('t')"
7:01 утра
LongTimePattern: эквивалент Get-Date -format T
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('T')"
7:01:32
UniversalSortableDateTimePattern с использованием формата универсального отображения времени: эквивалент Get-Date -format u
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('u')"
2019-06-02 07:01:33Z
Полная дата и время (длинная дата и долгое время) с использованием универсального времени: эквивалент Get-Date -format U
Применение этой опции к любому часовому поясу (кроме UTC) дает смещение +4:00 (возможно, в зависимости от местного часового пояса), что может быть проблематично.
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('U')"
2 июня 2019 г., 11:01:34
YearMonthPattern: Get-Date -format y
или эквивалент Get-Date -format Y
Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('y')"
июнь 2019 г.
взгляните на дата и время, поскольку он выглядит как тонкая оболочка вокруг даты и времени. Насколько я знаю, пост Скита по-прежнему актуален для дата и время, так что имейте это в виду.