Форматирование времени / даты из разных часовых поясов в Powershell - PullRequest
1 голос
/ 31 мая 2019

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

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Для преобразования текущего времени 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 Core , где -Command - нет дольше значение по умолчанию (-File -).

  • Хотя ваша конкретная команда будет работать без заключающих в нее двойных кавычек ("..."), обычно их лучше использовать, чтобы команды, содержащие метасимвол cmd.exe - например, & - не прерывались .

0 голосов
/ 01 июня 2019

Большое спасибо за полезные ответы.Я заметил, что таким способом можно применить задокументированные спецификаторы формата Microsoft Get-Date к часовым поясам (что было неочевидно, учитывая отсутствие опыта работы с Powershell).

Может оказаться полезным тестирование большинства из этих опций в наиболее распространенных часовых поясах.

Стандартное время линии даты [(UTC-12: 00) Международная линия даты Западная линия]
Стандартное время островных линий[(UTC + 14: 00) остров Киритимати]

Следующий код был запущен в субботу, 1 июня 2019 г., 01:01 по восточному поясному времени для преобразования в стандартное время на островах Лайн (UTC + 14: 00)

ShortDatePattern: Get-Date -format d эквивалент

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('d')"

6/2/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')"

6/2/2019 7:01

Общее (короткая дата и длительное время): Get-Date -format G эквивалент

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('G')"

6/2/2019 7:01:25 AM

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 GMT

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 AM

LongTimePattern: Get-Date -format T эквивалент

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('T')"

7: 01: 32 AM

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 г.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...