2017-01-17 5 views
1

Ich habe ein Problem mit 2 Zeilen Code, die nicht funktionieren, wie ich es erwarte. Der Punkt ist, dass das Objekt DateTime in string und zurück in DateTime konvertiert wird, wobei die Standardkonvertierung ohne explizite Formatangabe verwendet wird.String zu datetime Konvertierungsfehler in Powershell v5

$timeString = [DateTime]::Now.ToString() # contains 17.01.2017 20:01:30 
$time = [DateTime]$timeString # PS blows with error 

Also, im Grunde, es verwendet das Standard-Datumsformat die Zeichenfolge zu formatieren, aber es dann scheint ein anderes Format zu verwenden, um es zurück zu analysieren. Die folgende Codezeile funktioniert, aber:

$otherTime = [DateTime]"01/17/2017 20:01:30" # will get the initial date 

jemanden, der mir die richtige Dokumentation über die Frage der Typen Umwandlung zeigen könnte, und warum in diesem Fall wäre es unterschiedliche Formate verwenden, um Daten zu konvertieren hin und her?

Vielen Dank im Voraus.

+0

Ich konnte Ihr Problem nicht replizieren. Der erste Skriptblock funktionierte einwandfrei. –

+2

Verwenden Sie '[string] [DateTime] :: Now' oder' [DateTime] :: Now.ToString ([CultureInfo] :: InvariantCulture) '. – PetSerAl

Antwort

2

Parsing Daten ist immer ein Albtraum. Vor allem, wenn Sie in dem winzigen Teil der Welt leben, die 'außerhalb von USA' genannt wird :)

Im Allgemeinen werden Formatierungen und Parsing-Daten in .NET (und viele andere Dinge als String-Vergleich) durch Kultureinstellungen gesteuert. In einigen Fällen besteht das Standardverhalten darin, die aktuellen Kultureinstellungen zu verwenden. Convert.ToDateTime ist einer von ihnen. Wenn Sie einen Blick in die Dokumentation nehmen (Convert.ToDateTime Method (String)) heißt es:

Wenn der Wert nicht null ist, ist der Rückgabewert das Ergebnis des Aufrufs die DateTime.Parse Methode auf Wert ist die Formatierungsinformationen in einem Datetime mit Objekt, das initialisiert für die aktuelle Kultur ist. Das Wertargument muss die Darstellung eines Datums und einer Uhrzeit in einem der im DateTimeFormatInfo-Thema beschriebenen Formate enthalten.

Deshalb konvertiert es von Ihrer lokalisierten Datumszeichenkette. In anderen Fällen wird standardmäßig die Einstellung 'Invariant Culture' verwendet, die normalerweise 'US-Einstellungen' bedeutet. Die meisten Methoden sind überladen und können einen Parameter verwenden, der die Kultur angibt, die verwendet werden sollte, aber es erfordert ein wenig Suche in der .NET-Dokumentation.

Als Faustregel gilt: Verwenden Sie keine Zeichenfolgen, die lokalisiert sind, wenn sie dem Endbenutzer nicht angezeigt werden. Versuchen Sie immer, die "Invariant Culture" -Variante der Methode zu finden und verwenden Sie sie zum Formatieren und Parsen der Strings. Es wird dich vor vielen Kopfschmerzen bewahren.

2

Sie rufen implizit Convert.ToDateTime(String) auf, aber die gültigen Formate dieser Methode sind fest codiert (und scheinen nicht aufgelistet zu sein). Aus Ihrem Ausgabe-Datumsformat sehe ich, dass Sie wahrscheinlich nicht in den USA sind, wofür wahrscheinlich die meisten Formate ausgerichtet sind.

Stattdessen können Sie explizit Convert.ToDateTime(String, IFormatProvider) verwenden, um ihm mitzuteilen, welchen Kulturformatanbieter Sie möchten.

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo) 

Ich bin auf einem US-System, so dass ich bin mir nicht ganz sicher, ob dies noch funktioniert.

Sie können auch [DateTime]::TryParse() oder [DateTime]::TryParseExact() verwenden, um das/die gewünschte (n) Format (e) explizit anzugeben.

+0

Ja, ich verwende eine andere Kultur, wobei das Format "dd.MM.yyyy" lautet und das Trennzeichen "dot" ist. Ich habe mehr Nachforschungen angestellt, und es kommt vor, dass '[System.Convert] :: ToDateTime (" 01/18/2017 ") eine Ausnahme auslöst, während" [System.Convert] :: ToDateTime ("18.01.2017") zurückkehrt Gültiges Datum des 18. Januar. Es scheint also nicht so zu sein, dass es die 'Convert.ToDateTime' Methode aufruft, zumindest ohne Params. Vielleicht passiert es unveränderliche Kultur, wer weiß. – kosmakoff

+0

Grundsätzlich ging es bei meiner Frage nicht um Problemumgehungen, sondern um die technische Erklärung, warum es so funktioniert, wie es funktioniert. Vielleicht müssen wir irgendwo einen Fehler melden :) – kosmakoff

Verwandte Themen