DateTime ToFileTime und ToFileTimeUtc haben gleiche Ausgabe
Ich eine Datei geöffnet und verwendet werden ToUniversalTime()
und ToLocalTime()
- und Ausgang verschiedenen Zeiten. Allerdings, wenn ich ToFileTime()
und ToFileTimeUtc()
, bekomme ich die gleiche Nummer. Warum ist das so?
DateTime creationTime = File.GetCreationTime(@"c:\windows\setupact.log");
Console.WriteLine("utc time: " + creationTime.ToUniversalTime());
Console.WriteLine("file time: " + creationTime.ToLocalTime());
Console.WriteLine("file: " + creationTime.ToFileTime());
Console.WriteLine("utc: " + creationTime.ToFileTimeUtc());
Ausgabe
utc-Zeit: 8/22/2013 2:46:17 Uhr
file time: 8/22/2013 7:46:17 UHR
Datei: 130216563774628355
utc: 130216563774628355
Sollte nicht die Datei-und utc anders sein?
- Diese Frage und den link Dokument bieten mehr detail
- Ich weiß nicht, ob die Dokumentation für den link zu aktualisieren. Der link zu GotDotNet ist kaputt-und google-Suche nicht auftauchen einer web-Seite für GotDotNet. Auch, getestet habe ich die zahlen, die ich bekam, gegen LocalFileTimeToFileTime() in c++. Dies nimmt die lokale Zeit und wandelt es in UTC. Die Ausgabe für .ToFileTimeUtc ist die gleiche wie die lokale Zeit in c++ und nicht die UTC-Zeit
- Was ist Ihre eigene Zeitzone?
- West coast, USA, Nordamerika
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es gute Informationen in den vorhandenen Antworten, aber lassen Sie mich versuchen, eine pragmatische Zusammenfassung:
Die einzige Zeit, die Unterscheidung zwischen
System.DateTime.ToFileTime()
undSystem.DateTime.ToFileTimeUtc()
zählt, ist, wenn die Instanz.Kind
EigenschaftUnspecified
, d.h., wenn es ist unklar, ob der Zeit-Wert stellt einen lokalen oder UTC Zeit.Diese information war eigentlich eine Antwort von Hans Passant, dass er selbst gelöscht.
In anderen Wort: für
System.DateTime
Instanzen, deren.Kind
Eigenschaft entwederLocal
oderUtc
(die einzige andere mögliche Werte),System.DateTime.ToFileTime()
undSystem.DateTime.ToFileTimeUtc()
Verhalten sich identisch - das ist, was die OP erlebt, weil sein input-Wert wurde von.Kind
Local
(die Art zurückgegeben, die vonFile.GetCreationTime()
).Beachten Sie, dass die im Zusammenhang
System.DateTimeOffset
Art von design trägt immer explizite Zeit-zone Informationen, so dass es nie Unklarheiten, weshalb die Art nur hat eine.ToFileTime()
Methode.Als andere haben darauf hingewiesen, die zurück Wert immer stellt eine UTC-Zeit:
Datei Zeitwerte per definition, immer stellen einen Punkt in der Zeit in UTC.
So, sowohl
.ToFileTime()
und.ToFileTimeUtc()
erstellen Sie einen Punkt in der Zeit, ausgedrückt als die Anzahl der 100ns-Intervallen seit Mitternacht 1. Januar 1601 UTC.Zur Ergänzung der OP ' s eigenes Beispiel mit einem, wo
.ToFileTime()
und.ToFileTimeUtc()
tun unterscheiden sich im Ergebnis:Beispiel-Ausgabe in der US Eastern time zone:
Aus der docs:
Die Anzahl der Nanosekunden seit 1-1-1601 UTC, ändern sich nicht, egal in welcher Zeitzone Sie sind.
Aus der Quelle der .net framwork:
So, wenn Sie
ToFileTimeUtc
und Sie haben eine unbestimmteDateTime
es gibt Ihnen die nanosecs seit 1-1-1601, egal welche Zeitzone ist es ursprünglich vom. Das könnte für eine Stunde, jedes Jahr, wenn die timezone DST geben Sie eine ungültige Zeit.Wenn man sich die
ToFileTime()
Dokumentation auf MSDN, es sagt:Alle Datei-Zeiten werden in UTC gespeichert. Dann Anwendungen wie Explorer, konvertiert die UTC-Zeit in Lokale Zeit für die Anzeige Zwecke.
Wenn man sich weiter in den Abschnitt "Bemerkungen" des
ToFileTime()
, sehen Sie ein "Notizen zum Anrufer" Abschnitt. Das weitere erklärt, wieToFileTime()
undToFileTimeUtc()
erwartet wurden, verwendet werden.