我正在尝试使用TimeZone在系统上显示本地时间。如何在任何系统上以最简单的方式以这种格式显示时间?:
时间:美国东部标准时间8:00:34
我当前正在使用以下脚本:
$localtz = [System.TimeZoneInfo]::Local | Select-Object -expandproperty Id
if ($localtz -match "Eastern") {$x = " EST"}
if ($localtz -match "Pacific") {$x = " PST"}
if ($localtz -match "Central") {$x = " CST"}
"Time: " + (Get-Date).Hour + ":" + (Get-Date).Minute + ":" + (Get-Date).Second + $x
我希望能够在不依赖简单逻辑的情况下显示时间,但能够在任何系统上提供本地时区。
最佳答案
尽管这可能有点天真,但这是不用switch语句获得缩写的一种方法:
[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
我的正则表达式可能有一些不足之处。
以上对于我的时区的输出是
EST
。我做了一些查找,以查看其他GMT偏移量设置的值,但是.NET在DateTime
和TimeZoneInfo
之间似乎没有很好的链接,因此我不能只通过编程方式遍历它们来进行检查。对于StandardName
返回的某些字符串,这可能无法正常工作。编辑:我做了一些进一步的研究,手动更改计算机上的时区以进行检查,然后
TimeZoneInfo
的GMT+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
关于powershell - 在PowerShell中显示带有时区的当前时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11035905/