2012-06-14 18 views
10

Ich versuche die lokale Zeit auf meinem System mit der TimeZone anzuzeigen. Wie kann ich die Zeit in diesem Format die einfachste Art und Weise möglich, auf jedem System ?:Powershell Aktuelle Uhrzeit mit Zeitzone anzeigen

Zeitanzeige: 08.00.34 EST

ich zur Zeit mit dem folgende Skript:

$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 

Ich möchte die Zeit anzeigen können, ohne sich auf einfache Logik verlassen zu müssen, sondern die lokale Zeitzone auf jedem System angeben zu können. Vielen Dank!

Antwort

9

Während dies etwas ist ... naiv vielleicht, es ist ein Weg, eine zu erhalten Abkürzung ohne Schalteranweisung:

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

Mein regu lar Ausdruck lässt wahrscheinlich etwas zu wünschen übrig.

Die Ausgabe der oben genannten für meine Zeitzone ist EST. Ich schaute etwas, als ich sehen wollte, was der Wert für andere GMT-Offseteinstellungen sein würde, aber .NET scheint nicht sehr gute Verbindungen zwischen DateTime und TimeZoneInfo zu haben, also konnte ich nicht einfach programmgesteuert alle durchgehen, um zu überprüfen . Dies funktioniert möglicherweise nicht richtig für einige der Zeichenfolgen, die für StandardName zurückkommen.

EDIT: ich einige weitere Untersuchung habe die Zeitzone auf dem Computer ändert manuell wie folgt aussieht TimeZoneInfo für GMT+12 dies und zu überprüfen:

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 

, die dieses Ergebnis für meinen Code erzeugt:

Also, ich denke, Sie müssten erkennen, ob die StandardName scheint eine Reihe von Wörtern oder nur Offset-Bezeichnung, weil es keinen Standardnamen dafür ist.

Die weniger problematischen außerhalb der USA erscheinen die Drei-Wort-Format folgen:

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 
+0

Funktioniert wie eine Schönheit! –

+0

@Ken Ich war ein wenig peinlich berührt, aber ich bin froh, dass es den Trick gemacht hat :). – Shibumi

+1

'SA Pacific Standard Time' wird' SPST'; Das ist nicht wirklich genau. Die Informationen, die Sie gaben, waren jedoch sehr hilfreich. Ich entschied mich dafür, mich nur darauf zu beschränken, den Minuten-Offset zu bekommen: '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([datetime] :: Now) .TotalMinutes' – VertigoRay

1

Mir ist kein Objekt bekannt, das die Arbeit für Sie erledigen kann. Sie könnten die Logik in einer Funktion wickeln:

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 

Oder sogar die Initialen der Zeitzone id nehmen:

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

Denken Sie daran, ob anrufen 'IsDaylightSavingTime' überprüfen auf die aussehen 'StandardName' (ich denke, das ist dasselbe wie die 'Id', aber unklar, wenn immer wahr) oder' DaylightName' Eigenschaft. Außerdem müssen Sie den Standardfall für alle anderen Zeitzonen behandeln. – Richard

+0

@Richard Was ist mit dem Standardfall falsch? –

+0

Es gibt keins. – Richard

6

Sie in DateTime format strings aussehen sollte. Obwohl ich nicht sicher bin, dass sie einen Kurznamen für die Zeitzone zurückgeben können, können Sie leicht einen Offset von UTC erhalten.

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

Das gibt:

8:00:34 AM -04:00 
+0

Ich schätze die Hilfe bei der Formatierung. Allerdings muss ich noch eine Möglichkeit finden, die Zeitzone zuzuordnen. –

3

Seien Sie verabscheuen ein anderes Datumsformat zum definieren! Verwenden Sie ein vorhandenes wie rfc 1123. Es gibt sogar eine Powershell-Verknüpfung!

get-Date -format r 

Do, 14. Juni 2012 16.44.18 GMT

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

+5

Es sollte angemerkt werden, dass dies nicht sehr genau ist: Derzeit wird "GMT" gemeldet, wenn es wirklich "BST" ist (eine Stunde vor GMT). – Richard

+0

Dies ist jedoch nicht korrekt, da die aktuelle Zeitzone nicht GMT ist. Ich hatte zuvor Format verwendet, aber es gibt immer GMT statt der richtigen Zeitzone. –

+6

Sie erhalten GMT unabhängig von Ihrer Zeitzone, es ist hart codiert - (Get-Culture) .DateTimeFormat.RFC1123Pattern, –

0

Gerade kombiniert mehrere Skripte und schließlich konnte das Skript in meinem Domänencontroller. Script stellt die Ausgabe von Zeit und Zeitzone für alle Maschinen bereit, die unter der Domäne verbunden sind. Wir hatten ein großes Problem mit unseren Anwendungsservern und verwendeten dieses Skript, um die Zeit und die Zeitzone zu überprüfen.

  #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 
0

Dies ist eine bessere Antwort:

$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() 

Ausgang: 2017.03.20 11.55.55

Verwandte Themen