2012-06-14 32 views
10

Sto provando a visualizzare l'ora locale sul mio sistema con il fuso orario. Come posso visualizzare l'ora in questo formato il modo più semplice possibile su qualsiasi sistema ?:Powershell Visualizza l'ora corrente con fuso orario

Tempo: 08:00:34 EST

Attualmente sto usando il seguente 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 

Mi piacerebbe essere in grado di visualizzare il tempo senza fare affidamento sulla logica semplice, ma essere in grado di fornire il fuso orario locale su qualsiasi sistema. Grazie!

risposta

9

Mentre questo è un po '... forse ingenuo, è un modo per ottenere un abbreviazione senza istruzione switch:

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

My regu l'espressione lar lascia probabilmente a desiderare.

L'output di quanto sopra per il mio fuso orario è EST. Ho cercato un po 'come volevo vedere quale sarebbe stato il valore per le altre impostazioni di offset GMT, ma .NET non sembra avere ottimi collegamenti tra DateTime e TimeZoneInfo, quindi non ho potuto semplicemente scorrere a livello di codice tutti per controllare . Questo potrebbe non funzionare correttamente per alcune delle stringhe che ritornano per StandardName.

EDIT: ho ancora un po 'di indagine cambiare il fuso orario sul mio computer manualmente per controllare questo e un TimeZoneInfo per GMT+12 simile a questa:

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 

che produce questo risultato per il mio codice:

Quindi, suppongo che dovresti rilevare se il StandardName sembra essere un insieme di parole o solo una designazione offset perché non esiste un nome standard per questo.

Quelli meno problematici fuori degli Stati Uniti sembrano seguire il formato tre parole:

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

Funziona come una bellezza! –

+0

@Ken Ero un po 'imbarazzato, ma sono contento che abbia fatto il trucco :). – Shibumi

+1

'SA Standard Pacific Time' diventa' SPST'; che non è veramente preciso. Le informazioni che hai fornito sono state molto utili. Ho deciso di accontentarmi di ottenere l'offset dei minuti: '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([datetime] :: Now) .TotalMinutes' – VertigoRay

1

Non sono a conoscenza di alcun oggetto che possa fare il lavoro per voi. Si potrebbe avvolgere la logica in una funzione:

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 

o anche prendere le iniziali del fuso orario ID:

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

ricordarsi di chiamare 'IsDaylightSavingTime' per verificare se a guardare il 'StandardName' (penso che sia identico a' Id', ma non chiaro se sempre true) o 'DaylightName'. Inoltre è necessario gestire il caso predefinito per tutti gli altri fusi orari. – Richard

+0

@Richard Cosa c'è di sbagliato nel caso predefinito? –

+0

Non ce n'è uno. – Richard

6

Si dovrebbe guardare in DateTime format strings. Sebbene non sia sicuro che possano restituire un nome breve del fuso orario, è possibile ottenere facilmente un offset da UTC.

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

Questo restituisce:

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

Apprezzo l'aiuto con la formattazione. Tuttavia, devo ancora capire un modo per associare il fuso orario. –

3

essere restii a definire un altro formato datetime! Utilizzare uno esistente, ad esempio rfc 1123. C'è anche una scorciatoia PowerShell!

get-Date -format r 

Gio 14 Giu 2012 16:44:18 GMT

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

+5

Va notato che questo non è molto accurato: al momento riporta 'GMT' quando è veramente' BST' (un'ora prima del GMT). – Richard

+0

Ma questo non è corretto in quanto il fuso orario corrente non è GMT. In precedenza avevo utilizzato il formato, ma forniva sempre GMT anziché il fuso orario corretto. –

+6

Ottieni GMT indipendentemente dal tuo fuso orario, è hard coded - (Get-Culture) .DateTimeFormat.RFC1123Pattern, –

0

Proprio combinati diversi script e, infine, era in grado di eseguire lo script nel mio controller di dominio. Script fornisce l'output di time and timezone per tutte le macchine connesse sotto il dominio. Abbiamo avuto un grosso problema con i nostri server delle applicazioni e usato questo script per controllare il fuso orario e il fuso orario.

  #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

Questa è una risposta migliore:

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

uscita: 2017/03/20 23:55:55