Форматирование времени/даты из разных часовых поясов в Powershell

Мне нужно преобразовать вывод времени/даты 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.

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

lloyd 31.05.2019 03:56

Просто добавьте часть с ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss') в конец вашего второго примера.

montonero 31.05.2019 09:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
4 311
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы преобразовать текущее время 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.

Matt Johnson-Pint 31.05.2019 22:34

Спасибо, @MattJohnson, хорошие указатели. Мне неясно, чего на самом деле хочет ОП, поэтому я упростил ответ, чтобы показать только одно конкретное преобразование.

mklement0 01.06.2019 00:28

@MattJohnson Не могли бы вы привести примеры кода для ConvertTimeBySystemTimeZoneID и ConvertTimeFromUTC преобразования текущего времени из UTC (или стандартного времени Лайн-Айлендс) в стандартное восточное время? (Если только для другого возможного решения вопроса).

noni 01.06.2019 20:33

Большое спасибо за полезные ответы. Я заметил, что таким образом можно применить задокументированные спецификаторы формата 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 г.

Другие вопросы по теме