2012-06-14 57 views
10

Estoy tratando de mostrar la hora local en mi sistema con TimeZone. ¿Cómo puedo mostrar el tiempo en este formato la manera más simple posible en cualquier sistema ?:Powershell Mostrar la hora actual con la zona horaria

Hora: 08:00:34 AM EST

Actualmente estoy usando el siguiente 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 

Me gustaría poder mostrar el tiempo sin depender de una lógica simple, pero ser capaz de dar la zona horaria local en cualquier sistema. ¡Gracias!

Respuesta

9

Si bien esto es un poco ... quizás ingenua, es una manera de obtener un abreviatura sin declaración de cambio:

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

Mi lista de deseos La expresión lar probablemente deja algo que desear.

El resultado de lo anterior para mi zona horaria es EST. Hice algunas búsquedas porque quería ver cuál sería el valor para otras configuraciones de compensación GMT, pero .NET no parece tener muy buenos enlaces entre DateTime y TimeZoneInfo, así que no pude simplemente ejecutarlos programáticamente para verificar . Es posible que esto no funcione correctamente para algunas de las cadenas que regresan para StandardName.

EDIT: he hecho un poco más investigación cambiar la zona horaria en mi equipo manualmente para comprobar esto y un TimeZoneInfo para GMT+12 se ve así:

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 

que produce este resultado para mi código:

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

Así que, supongo que tendrías que detectar si el StandardName parece ser un conjunto de palabras o simplemente designación de desplazamiento porque no hay un nombre estándar para él.

Los menos problemáticos fuera de los EE.UU. parecen seguir el formato de tres palabras:

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

¡Funciona como una belleza! –

+0

@Ken Estaba un poco avergonzado, pero me alegro de que haya sido el truco :). – Shibumi

+1

'SA hora estándar del Pacífico' se convierte en' SPST'; que no es realmente exacto La información que brindó fue muy útil. Decidí simplemente conformarme con obtener la compensación de minutos: '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([datetime] :: Now) .TotalMinutes' – VertigoRay

1

No conozco ningún objeto que pueda hacer el trabajo por usted. Usted puede envolver la lógica en una función:

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 incluso tomar las iniciales del Tiempo identificador de la zona:

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

Recuerde llamar 'IsDaylightSavingTime' para comprobar si se mira el 'StandardName' (creo que esto es lo mismo que la propiedad' Id', pero no está claro si siempre es verdad) o 'DaylightName'. También necesita manejar el caso predeterminado para todas las demás zonas horarias. – Richard

+0

@Richard ¿Qué pasa con el caso predeterminado? –

+0

No hay uno. – Richard

6

Usted debe mirar en DateTime format strings. Aunque no estoy seguro de que puedan devolver un nombre corto de zona horaria, puede obtener fácilmente un desplazamiento de UTC.

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

Esto devuelve:

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

Aprecio la ayuda con el formateo. Sin embargo, todavía tengo que encontrar una manera de asociar la zona horaria. –

3

Sé reacios a definir otro formato de fecha y hora! Use uno existente, como rfc 1123. ¡Incluso hay un atajo de Powershell!

get-Date -format r 

Jue 14 Jun 2012 16:44:18 GMT

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

+5

Debe tenerse en cuenta que esto no es muy preciso: actualmente informa 'GMT' cuando realmente es' BST' (una hora por delante de GMT). – Richard

+0

Pero esto no es correcto ya que la zona horaria actual no es GMT. Anteriormente utilizaba el formato, pero siempre proporciona GMT en lugar de la zona horaria correcta. –

+6

Obtiene GMT independientemente de su zona horaria, está codificado en forma rígida - (Get-Culture) .DateTimeFormat.RFC1123Pattern, –

0

que sólo juntos varios guiones y finalmente fue capaz de ejecutar el script en mi controlador de dominio. Script proporciona la salida de la hora y la zona horaria para todas las máquinas conectadas bajo el dominio. Tuvimos un problema importante con nuestros servidores de aplicaciones y usamos este script para verificar la hora y la zona horaria.

  #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

Ésta es una respuesta mejor:

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

de salida: 20/03/2017 11:55:55 PM

Cuestiones relacionadas