Ich versuche, eine C # DateTime-Variable in Unix-Zeit zu konvertieren, dh die Anzahl der Sekunden seit dem 1. Januar 1970. Es sieht so aus, als ob eine DateTime tatsächlich als Anzahl der 'Ticks' seit dem 1. Januar 0001 implementiert ist.
Mein aktueller Gedanke ist, den 1. Januar 1970 wie folgt von meiner DateTime abzuziehen:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
Gibt es einen besseren Weg?
Antworten:
Das ist es im Grunde. Dies sind die Methoden, mit denen ich in und aus der Unix-Epoche konvertiere:
Update: Ab .Net Core 2.1 und .Net Standard 2.1 kann eine DateTime gleich der Unix-Epoche aus der Statik abgerufen werden
DateTime.UnixEpoch
.quelle
t specify this explicitly and somewhere later in code you
ToUniversalTime () nicht haben, haben Sie eine schlechte Utc-Zeit, da DateTime standardmäßig NICHT Utc ist.Wenn der Rest Ihres Systems mit DateTimeOffset anstelle von DateTime einverstanden ist, gibt es eine sehr praktische Funktion:
quelle
var time = DateTimeOffset.FromUnixTimeSeconds(5000);
MS DocDas einzige, was ich sehe, ist, dass es seit Mitternacht des 1. Januar 1970 UTC sein soll
quelle
Sie möchten wahrscheinlich DateTime.UtcNow verwenden, um Zeitzonenprobleme zu vermeiden
quelle
Dieser Ansatz ist gut, wenn die betreffende Datums- und Uhrzeit in UTC angegeben ist oder die Ortszeit in einem Gebiet darstellt, in dem die Sommerzeit noch nie eingehalten wurde. Die DateTime-Differenzroutinen berücksichtigen nicht die Sommerzeit und betrachten daher den 1. Juni um Mitternacht als ein Vielfaches von 24 Stunden nach dem 1. Januar um Mitternacht. Mir ist in Windows nichts bekannt, das historische Sommerzeitregeln für die aktuelle Zeit meldet Ich glaube nicht, dass es eine gute Möglichkeit gibt, vor der letzten Änderung der Sommerzeitregel richtig damit umzugehen.
quelle
Sie können eine Startzeit und eine Endzeit von DateTime erstellen und dann endTime.Subtract (startTime) ausführen. Geben Sie dann Ihre span.Seconds aus.
Ich denke das sollte funktionieren.
quelle
Ich verwende das Jahr 2000 anstelle der Epochenzeit in meinem Kalkül. Das Arbeiten mit kleineren Stückzahlen ist einfach zu lagern und zu transportieren und JSON-freundlich.
Sekunden ab dem Jahr 2000 :
Sekunden von der Unix-Zeit:
Zum Beispiel ist das Jahr 2020:
var year2020 = (new DateTime ()). AddYears (2019) .Ticks; // Da DateTime bereits im ersten Jahr beginnt
637134336000000000 Zecken seit dem 1. Januar 0001
63713433600 Sekunden seit dem 1. Januar 0001
1577836800 Sekunden seit der Epoche
631152000 Sekunden seit dem Jahr 2000
Verweise:
Epoch Time Converter: https://www.epochconverter.com
Konverter für Jahr 1: https://www.epochconverter.com/seconds-days-since-y0
quelle