Display current time with time zone in PowerShell

powershell, time, timezone

Solution

While this is a bit ... naive perhaps, it's one way to get an abbreviation without a switch statement:

[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')

My regular expression probably leaves something to be desired.

The output of the above for my time zone is `EST`. I did some looking as I wanted to see what the value would be for other GMT offset settings, but .NET doesn't seem to have very good links between `DateTime` and `TimeZoneInfo`, so I couldn't just programmatically run through them all to check. This might not work properly for some of the strings that come back for `StandardName`.

EDIT: I did some more investigation changing the time zone on my computer manually to check this and a `TimeZoneInfo` for `GMT+12` looks like this:

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

Which produces this result for my code:

PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
U+12

So, I guess you'd have to detect whether the `StandardName` appears to be a set of words or just offset designation because there's no standard name for it.

The less problematic ones outside the US appear to follow the three-word format:

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

Problem

I'm trying to display the local time on my system with the TimeZone. How can I display time in this format the simplest way possible on any system?: Time: 8:00:34 AM EST I'm currently using the following script: ``` $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 ``` I'd like to be able to display the time without relying on simple logic, but be able to give the local timezone on any system.

Original source