Если вы не знакомы с PowerShell, вот фрагмент, который берет метку времени в формате UTC (Зулу) и преобразует ее в местное время.
#input format: '2024-03-20 19:26 Z'
param ($timestamp)
$result = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date -Date $timestamp), (Get-TimeZone | Select-Object -ExpandProperty Id))
Write-Output $result
Это дает мне результат:
Среда, 20 марта 2024 г., 12:26:00
Теперь я хочу добавить в конце этого вывода аббревиатуру местного трехбуквенного часового пояса (например, PST).
Я нашел эту команду, и она приближает меня:
$localtzid = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]})
"Time: {0:T} $tz" -f (Get-Date)
..получает время в одной строке, а затем трехбуквенное сокращение в следующей строке.
Чего я хочу добиться, так это:
Среда, 20 марта 2024 г., 12:26:00 по тихоокеанскому стандартному времени.
Пробовал Write-Output "$($result) $($localtzid)" - полностью меняет формат. Пробовал Write-Output $result, $localtzid -join ',' - полностью меняет формат. Я пробовала concat... Я столько всего пробовала.
'{0:F} {1}' -f $result, $localized . Learn.microsoft.com/en-us/dotnet/standard/base-types/…'{0:F} {1}' -f (Get-Date), ( -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]}))lang-ps # input format: '2024-03-20 19:26 Z' param ($timestamp)$result = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date -Date $timestamp), (Get-TimeZone | Select-Object -ExpandProperty Id)) Write-Output "$($result) $(-join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]}))" Результат: 20 марта 2024 г., 12:26:00 по тихоокеанскому стандартному времени. Желаемый результат: среда, 20 марта 2024 г., 12:26:00 по тихоокеанскому времени.
нет, когда я говорю «формат ввода», я имею в виду то, как выглядит $timestamp, поступающий в скрипт в качестве единственного входного параметра. Проблема, с которой я столкнулся, связана с форматом вывода: ввод правильно обрабатывается функцией, которая преобразует его из GMT (Z) в мой местный часовой пояс.





Учитывая, что имена часовых поясов, включая инициализмы, такие как PST, не стандартизированы повсеместно, я предлагаю вместо этого отформатировать дату со смещением UTC (например, -07:00):
& {
param ([string] $timestamp)
$localTime = [datetime] $timestamp
$localTime.ToString('F') + ' ' + $localTime.ToString('zzz')
} '2024-03-20 19:26 Z'
Например, в тихоокеанском часовом поясе США результат будет следующим:Wednesday, March 20, 2024 12:26:00 PM -07:00
Если вы все еще хотите использовать инициализм, например PST, и получить его от начальных букв полного названия местного часового пояса, потребуется дополнительная работа:
& {
param ($timestamp)
$time = [datetimeoffset] [datetime] $timestamp
$localTimeZone = [System.TimeZoneInfo]::Local
$isDstTime = $time.Offset -ne $localTimeZone.BaseUtcOffset
$timeZoneName = ($localTimeZone.StandardName, $localTimeZone.DaylightName)[$isDstTime]
$time.ToString('F') + ' ' + (-join (-split $timeZoneName).ForEach({ $_[0] }))
} '2024-03-20 19:26 Z'
В результате должно получиться Wednesday, March 20, 2024 12:26:00 PM PDT в тихоокеанском часовом поясе США.
Обратите внимание, что используется PDT (от Pacific Daylight Time), а не PST (от Pacific Standard Time), поскольку временная метка попадает в период летнего времени.
Ваш более длинный фрагмент просто потрясающий! Я могу безопасно использовать 4 часовых пояса США. Я живу в доме на колесах и не планирую ехать на Гавайи.
Да, $localtzid содержит значение PST. Когда я использую предложенный вами формат вывода, он меняет его с желаемого вывода, включающего день недели и месяц, на следующий: 20.03.2024 12:26:00 PST - так что да, он добавляет PST к конец вывода.. НО.. Цель: среда, 20 марта 2024 г., 12:26:00 по тихоокеанскому времени Спасибо!