2016-09-09 5 views
0

Ich habe eine einfache Funktion geschrieben, um jede UTC-Zeit in die aktuelle UK-Zeit umzurechnen (abhängig davon, ob die Sommerzeit in der aktuellen Saison angewendet wird, ist das Ergebnis entweder die gleiche UTC oder UTC + 1)):PowerShell - Konvertierung von UTC in britische Sommerzeit

function Convert-UTCToUKTime 
{ 
    [CmdletBinding()] 
    param 
    (
     [Parameter(Mandatory = $true)] $UTCTime 
    ) 
    $UKTime = (Get-Date -Date $UTCTime) 
    if ($UKTime.IsDaylightSavingTime() -eq $true) 
    { 
     $UKTime = $UKTime.AddHours(1) 
    } 
    return $UKTime 
} 

ich in der anderen Funktion verwenden diese auch aktuelle UK-Zeit und es funktioniert gut zu erhalten:

function Get-UKTime 
{ 
    [CmdletBinding()] 
    [OutputType([System.String])] 
    param 
    (
     [Parameter(Mandatory = $true)] [String] $Format 
    ) 
    $UKTime = Convert-UTCToUKTime -Time ((Get-Date).ToUniversalTime()) 

    return $UKTime.ToString($Format) 
} 

Allerdings, wenn ich versuche, übergeben sie die Konvertierungsfunktion eine Datei erstellt Zeit (was natürlich in UTC ist), es erkennt keine Sommerzeit e und daher kehrt mit einer Stunde der UK Zeitwert hinter (I unter Verwendung Get-Date die exakt gleiche Zeit zu vertreiben versuchte - es gab keine Probleme):

[System.IO.FileInfo] $FileInfo = $FullFileName 
$FileCreatedTime = Convert-UTCToUKTime -UTCTime (($FileInfo.CreationTimeUTC) 

fand ich das Update, die mir geholfen, diese Funktion zu erhalten, wie ich erwarte, dass bis (von dem DateTime Typ String Umwandlung vor als Parameter übergeben):

$FileCreatedTime = Convert-UTCToUKTime -UTCTime (($FileInfo.CreationTimeUTC).ToString("yyyy/MM/dd hh:mm:ss")) 

aber ich bin nicht wirklich sicher, warum das funktioniert. Was ist der Unterschied zwischen der Verwendung von Get-Date und dem Übergeben der Zeit für die Dateierstellung als Parameter, da beide den gleichen Typ DateTime haben?

Jede Erklärung würde wirklich geschätzt werden.

+0

'[Timezone] :: ConvertTimeBySystemTimeZoneId ($ UTCTime, 'UTC', 'GMT Standard Time')' – PetSerAl

+0

@PSA, ist GMT keine Zeit 'UK' –

+0

@JaquelineVanek Hat man London nicht hier haben '[Timezone]: : FindSystemTimeZoneById ('GMT-Standardzeit'). DisplayName'? Ist London nicht mehr Großbritannien? – PetSerAl

Antwort

0

Nach ausführlichen Tests und Diskussionen mit Kollegen Kollegen, ich denke, ich habe jetzt die Antwort auf meine ursprüngliche Frage.

Erstens, dank @PetSerAl für den Vorschlag, die von Microsoft definierte 'GMT Standard Time' Zeitzone zu verwenden, die mich und andere Benutzer in der Community als kontrovers bezeichnet haben Leben (daher die Verwirrung), aber ich fand es genau das, was ich in meinem Fall verwenden muss.

Warum habe ich unterschiedliche Ergebnisse erhalten, wenn die Zeichenfolge und das DateTime-Objekt in UTC gleichzeitig übergeben wurden? Die Antwort lautet wie folgt:

Sobald ich das Objekt an die Funktion übergeben, die ein Ergebnis der Zeit von Dateierstellungsstempel in UTC war, wurde es automatisch als richtige UTC-Zeit Typ Objekt initiiert, mit der Eigenschaft .Kind auf Wert festgelegt UTC (es gibt nur zwei gültige Werte für diese Eigenschaft - UTC und Local für alles andere). Die Funktion, die diesen Parameter abruft, erkannte zuerst die UTC-Zeit und konnte die Sommerzeit nicht erkennen, da sie von der UTC-Zeitzone nicht unterstützt wird. Im zweiten Fall des Sendens der Zeichenfolge an die Funktion war der Hauptunterschied hier, dass nach der Umwandlung der tatsächlichen Zeichenfolge in das DateTime Objekt innerhalb meiner Funktion Get-Date, die standardmäßig das Ergebnisobjekt instanziiert, indem lokale Maschine Zeit (ich arbeite in Litauen) und IsDaylightSavingTime() konnte jetzt den $True Wert zurückgeben, da meine lokale Zeitzone es unterstützt.

0

Ich bemerkte die falsche Annahme, dass GMT war britische Zeit diese mehrere Jahre zurück (während der Arbeit bei Microsoft.) Ich denke, ich habe einen Fehler dafür eingereicht, aber ich bin mir nicht sicher. Anscheinend benötigen Sie eine benutzerdefinierte Zeitzone.

Ich fand diesen interessanten Post bei der Definition von benutzerdefinierten Zeitzonen: http://subjectivecoder.blogspot.com.au/2013/04/creating-custom-windows-timezones.html. Dies sollte mit PowerShell möglich sein.

Verwandte Themen