Si bien esto es un poco ... quizás ingenua, es una manera de obtener un abreviatura sin declaración de cambio:
[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
Mi lista de deseos La expresión lar probablemente deja algo que desear.
El resultado de lo anterior para mi zona horaria es EST
. Hice algunas búsquedas porque quería ver cuál sería el valor para otras configuraciones de compensación GMT, pero .NET no parece tener muy buenos enlaces entre DateTime
y TimeZoneInfo
, así que no pude simplemente ejecutarlos programáticamente para verificar . Es posible que esto no funcione correctamente para algunas de las cadenas que regresan para StandardName
.
EDIT: he hecho un poco más investigación cambiar la zona horaria en mi equipo manualmente para comprobar esto y un TimeZoneInfo
para GMT+12
se ve así:
PS> [TimeZoneInfo]::Local
Id : UTC+12
DisplayName : (GMT+12:00) Coordinated Universal Time+12
StandardName : UTC+12
DaylightName : UTC+12
BaseUtcOffset : 12:00:00
SupportsDaylightSavingTime : False
que produce este resultado para mi código:
PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
U+12
Así que, supongo que tendrías que detectar si el StandardName
parece ser un conjunto de palabras o simplemente designación de desplazamiento porque no hay un nombre estándar para él.
Los menos problemáticos fuera de los EE.UU. parecen seguir el formato de tres palabras:
PS> [TimeZoneInfo]::Local
Id : Tokyo Standard Time
DisplayName : (GMT+09:00) Osaka, Sapporo, Tokyo
StandardName : Tokyo Standard Time
DaylightName : Tokyo Daylight Time
BaseUtcOffset : 09:00:00
SupportsDaylightSavingTime : False
PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
TST
¡Funciona como una belleza! –
@Ken Estaba un poco avergonzado, pero me alegro de que haya sido el truco :). – Shibumi
'SA hora estándar del Pacífico' se convierte en' SPST'; que no es realmente exacto La información que brindó fue muy útil. Decidí simplemente conformarme con obtener la compensación de minutos: '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([datetime] :: Now) .TotalMinutes' – VertigoRay