虽然这有点......也许很天真,但这是在没有 switch 语句的情况下获得缩写的一种方法:
[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
我的正则表达式可能还有一些不足之处。
我的时区的上述输出是EST
. 我做了一些查看,因为我想看看其他 GMT 偏移设置的值是多少,但是 .NET 似乎在DateTime
和之间没有很好的链接TimeZoneInfo
,所以我不能只是以编程方式运行它们来检查。对于某些返回的字符串,这可能无法正常工作StandardName
。
编辑:我做了更多调查,手动更改计算机上的时区以检查这一点,TimeZoneInfo
forGMT+12
看起来像这样:
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
这为我的代码产生了这个结果:
PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
U+12
所以,我想你必须检测StandardName
它是一组单词还是只是偏移指定,因为它没有标准名称。
美国以外的问题较少的似乎遵循三字格式:
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