Mit DateTime.ParseExact-um nur die Zeit (ohne den Tag)
Ich zu unerwarteten Ergebnissen kommen, wenn ich mit DateTime.ParseExact.
Hier mein test-code:
Dim MinVal As DateTime = #12:00:01 AM#
Dim MaxVal As DateTime = #11:59:59 PM#
Dim TooBig1, Equal1 As Boolean
Dim TooBig2, Equal2 As Boolean
Dim dt1 As DateTime = #12:00:01 AM#
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", Globalization.DateTimeFormatInfo.InvariantInfo)
TooBig1 = (dt1.CompareTo(MaxVal) > 0)
Equal1 = (dt1.CompareTo(MinVal) = 0)
TooBig2 = (dt2.CompareTo(MaxVal) > 0)
Equal2 = (dt2.CompareTo(MinVal) = 0)
Das Ergebnis ist gut für dt1:
- es zeigt im debugger als #12:00:01 AM# (ohne Tag)
- TooBig1 ist Falsch
- Equal1 Wahr ist
Aber das Ergebnis ist (falsche?) unerwartet für dt2:
- es zeigt im debugger als #9/30/2011 12:00:01 AM#
- TooBig2 Wahr ist
- Equal2 ist Falsch
Sieht es aus wie es ist, weil der Tag ist systematisch Hinzugefügt werden, indem Sie ParseExact-auch wenn ich nur die Zeit angeben, in das format.
Meine Frage ist: Wie kann ich Lesen, nur die Zeit mit DateTime.ParseExact?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dokumentation Staaten:
Wenn Sie möchten, eine Zeit ohne Datum, die Sie verwenden können:
TimeSpan
Objekt, aber nicht eineDateTime
. Die Tatsache, dass Sie Glanz über dieses wichtige detail zeigt sich wieder einmal, dass die Verwendung von nicht typisierten Variablen ist eine schreckliche Praxis.TimeSpan
. Das ist scheinbar das, was der OP wollte, oder er hat schnell herausgefunden, wie man erstellen Sie eine neueDateTime
aus. Es gibt keine untypisierten Variablen in diesem code-snippet; beide sind stark typisiert, da der compiler würde klar die erste Zeit, die Sie versucht, auftimeOnly
alsDateTime
. Hast du vielleicht sagen, dass unter Ausnutzung der type inference ist eine schlechte Sache?DateTime
minusDateTime
entspricht nicht einDateTime
.verwenden
dt1.TimeOfDay
unddt2.TimeOfDay
für solche Vergleiche... also unter der Tag-Teil aus der Gleichung...Wenn Sie nicht geben Sie einen Tag, dass es anscheinend geht heute davon. (Nicht unvernünftig, wenn Sie schreiben, sagen, Zeit-tracking-software).
Wenn Sie wollen einfach nur die Zeit Teil, könnte man analysieren, wie Sie es bereits tut, und dann schnappen Sie sich einfach die Zeit-of-day Teil:
Wird ein
TimeSpan
statt einerDateTime
, aber wenn Sie nicht wirklich müssen es als DateTime, TimeSpan ist besser geeignet für etwas, das nur Stunden/Minuten/Sekunden, nicht Tage.(Sie könnten auch versuchen, mit TimeSpan.ParseExact in den ersten Platz, aber es ist nicht gebaut, um zu behandeln, AM/PM, und würde der parse-12:00:01 als 12 Stunden. So werden Sie wahrscheinlich tun wollen, DateTime.ParseExact gefolgt von .TimeOfDay.)
Wenn Sie tatsächlich tun müssen vertreten Sie als eine DateTime-mit einem Datum-Teil von, sagen wir, 1/1/0001 -- konnte man immer konvertieren, dass die Zeitspanne wieder in einen DateTime-manuell: