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

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

время: 8: 00: 34 AM EST

в настоящее время я использую следующий скрипт:

$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

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

6 ответов


пока это немного ... наивно возможно, это один из способов получить an аббревиатура без оператора switch:

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

мое регулярное выражение, вероятно, оставляет желать лучшего.

выход выше для моего часового пояса EST. Я сделал некоторые, глядя, как я хотел увидеть, какое значение будет для других настроек смещения GMT, но .NET, похоже, не имеет очень хороших связей между DateTime и TimeZoneInfo, поэтому я не мог просто программно запустите их все, чтобы проверить. Это может не работать для некоторых строк, которые возвращаются к StandardName.

EDIT: я сделал еще несколько исследований, изменив часовой пояс на моем компьютере вручную, чтобы проверить это и 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*', '')
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*', '')
TST

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

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

возвращает:

8:00:34 AM -04:00

не хотелось бы определять другой формат datetime! Используйте существующий, например в RFC 1123. Есть даже ярлык Powershell!

get-Date -format r

чт, 14 июня 2012 16:44: 18 GMT

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


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

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

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

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

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

            #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

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

$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 часов