Powershell Отображает текущее время с часовым поясом

Я пытаюсь отображать локальное время в моей системе с помощью TimeZone. Как я могу отображать время в этом формате как можно проще в любой системе?:

Время: 8:00:34 утра EST

В настоящее время я использую следующий 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

Я хотел бы показать время, не полагаясь на простую логику, но уметь дать локальный часовой пояс в любой системе. Спасибо!

Ответ 1

Хотя это немного... наивно, возможно, это один из способов получить аббревиатуру без оператора 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

Ответ 2

Вы должны заглянуть в строки DateTime. Хотя я не уверен, что они могут вернуть короткое имя часового пояса, вы можете легко получить смещение от UTC.

$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)

Это возвращает:

8:00:34 AM -04:00

Ответ 3

Не смей определять другой формат даты и времени! Используйте существующий, например rfc 1123. Там даже ярлык Powershell!

get-Date -format r

Thu, 14 Jun 2012 16:44:18 GMT

http://technet.microsoft.com/en-us/library/hh849887.aspx

Ответ 4

Я не знаю ни одного объекта, который мог бы выполнить эту работу для вас. Вы можете обернуть логику в функции:

function Get-MyDate{

    $tz = switch -regex ([System.TimeZoneInfo]::Local.Id){
        Eastern {'EST'; break}
        Pacific {'PST'; break}
        Central {'CST'; break}
    }

    "Time: {0:T} $tz" -f (Get-Date)
}    

Get-MyDate

Или даже взять инициалы идентификатора часового пояса:

$tz = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]})
"Time: {0:T} $tz" -f (Get-Date)

Ответ 5

Совместил несколько сценариев и, наконец, смог запустить script в моем контроллере домена. script обеспечивает вывод времени и часового пояса для всех машин, подключенных под доменом. У нас была серьезная проблема с нашими серверами приложений, и мы использовали этот script для проверки времени и часового пояса.

            #Below Scripts provides the Time and TimeZone for the Connected Machines in a Domain
            #Appends the Output to a text file with the time stamp
            #Checks if the host is reachable or not via ping command

            Start-Transcript -path C:\output.txt -append 
            $ldapSearcher = new-object directoryservices.directorysearcher;
            $ldapSearcher.filter = "(objectclass=computer)";
            $computers = $ldapSearcher.findall();

            foreach ($computer in $computers)
            {
                $compname = $computer.properties["name"]
                $ping = gwmi win32_pingstatus -f "Address = '$compname'"
                $compname
                if($ping.statuscode -eq 0)
                {   
                   try
                   {
                        $ErrorActionPreference = "Stop"
                         write-host "Attempting to determine timezone information for $compname…"
                         $Timezone = Get-WMIObject -class Win32_TimeZone -ComputerName $compname

                         $remoteOSInfo = gwmi win32_OperatingSystem -computername $compname   
                         [datetime]$remoteDateTime = $remoteOSInfo.convertToDatetime($remoteOSInfo.LocalDateTime)    

                                    if($Timezone)
                        {
                             foreach($item in $Timezone)
                             {
                                $TZDescription = $Timezone.Description
                                $TZDaylightTime = $Timezone.DaylightName
                                $TZStandardTime = $Timezone.StandardName
                                $TZStandardTime = $Timezone.StandardTime

                             }
                             write-host "Timezone is set to $TZDescription`nTime and Date is $remoteDateTime`n**********************`n"

                        }
                    else
                        {
                            write-host ("something went wrong")
                        }

                    }
                    catch 
                    {
                        write-host (" you have insufficient rights to query the computer or the RPC server is not available")
                    }
                    finally
                    {
                        $ErrorActionPreference = "Continue"
                    }

                }
                else
                         {
                            write-host ("Host $compname Not reachable from ping `n")
                         }

            }

            Stop-Transcript

Ответ 6

Это лучший ответ:

$A = Get-Date                    #Returns local date/time
$B = $A.ToUniversalTime()        #Convert it to UTC

# Figure out your current offset from UTC
$Offset = [TimeZoneInfo]::Local | Select BaseUtcOffset   

#Add the Offset
$C = $B + $Offset.BaseUtcOffset
$C.ToString()

Вывод: 3/20/2017 11:55:55 PM