Wenn mir nichts fehlt, ist die "Epoche" einfach der Ausgangspunkt eines bestimmten Zeitnehmungsschemas. Beispiele sind 1/1/0001, 1/1/1970 und 1/1/2000. Es ist eher ein Attribut eines Schemas als ein Schema (z. B. Julian) selbst.
Bob Kaufman
8
Die Zeit seit der Epoche ist die Anzahl der Sekunden seit dem 1. Januar 1970 UTC.
Taylor Leese
13
@ Taylor Das ist die Epoche für Unix-Zeit, und es ist wahrscheinlich richtig, aber es ist nicht die einzige gültige Epoche. Unix-Zeitbenutzer sollten sich in diesem Punkt nicht verwirren.
Damit dies richtig funktioniert, musste ich .AddSeconds in .AddMilliseconds ändern. Sie müssen wissen, ob Ihre Nummer aus Sekunden oder Millisekunden stammt, um das richtige Ergebnis zu erhalten. So zum Beispiel das folgende Datum: 1406310305188 (25. Juli 2014). Mit epochconverter.com können Sie auch Ihre Conversion-Ergebnisse überprüfen.
jrandomuser
5
Sie sollten entweder den Parametertyp in double ändern (da AddSeconds double akzeptiert und daher auf double heruntergestuft wird) oder der Methodenbeschreibung einen Haftungsausschluss hinzufügen, dass nur 53 von 64 Bit Genauigkeit im Argument erhalten bleiben.
Tomosius
6
@jrandomuser: Die Unix-Epochenzeit wird traditionell als Sekunden seit The Epoch dargestellt. Seitdem ist es üblich, Millisekunden seit The Epoch zu verwenden (zum Beispiel JavaScript), aber die klassische Definition ist Sekunden. Unterm Strich wissen Sie einfach, was Ihr Eingabewert ist (Sekunden, Millisekunden, Ticks, was auch immer) und verwenden Sie die richtige AddXYZMethode.
TJ Crowder
Versuchen Sie es zuerst mit AddMilliseconds. Wenn das Jahr noch 1970 ist, führen Sie AddSeconds aus. Auf diese Weise funktioniert es die ganze Zeit, ohne sich um Millisekunden oder Sekunden sorgen zu müssen. Außerdem können Sie einen Überlauf verhindern. Wenn Sie eine große Zahl an AddSeconds übergeben, stürzt der Code ab
Tono Nam,
213
Die neueste Version von .Net (v4.6) hat gerade die integrierte Unterstützung für Unix- Zeitkonvertierungen hinzugefügt. Dies schließt sowohl die Unix-Zeit als auch die Unix-Zeit ein, die entweder durch Sekunden oder Millisekunden dargestellt wird.
long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
Hinweis: Diese Methoden konvertieren nach und von DateTimeOffset. Um eine DateTimeDarstellung zu erhalten, verwenden Sie einfach die DateTimeOffset.DateTimeEigenschaft:
Beachten Sie den Kommentar von CodesInChaos unten, dass das obige FromUnixTimeein DateTimemit einem Kindvon zurückgibt Utc, was in Ordnung ist, aber das Obige ToUnixTimeist viel verdächtiger, da es nicht berücksichtigt, welche Art von DateTimegegeben dateist. Um zuzulassen date, Kinddass entweder Utcoder ist Local, verwenden Sie ToUniversalTime:
ToUnixTimefunktioniert nur richtig, wenn das Datum in Utc ist. Fügen Sie entweder einen Scheck hinzu oder konvertieren Sie ihn. (Ich persönlich bevorzuge den Scheck)
CodesInChaos
2
Ich habe gerade die letzte Stunde damit verbracht herauszufinden, warum dies nicht funktioniert. Sie müssen in millisecondsnicht Sekunden arbeiten !!!
KristianB
7
@KristianB: "Unix-Zeit" ist seit The Epoch traditionell Sekunden und keine Millisekunden, obwohl ich heutzutage sorgfältig überprüfe, welche Definition jemand verwendet. Sekunden waren früher gut genug und gaben uns einen angemessenen Bereich auf beiden Seiten von The Epoch in vorzeichenbehafteten 32-Bit-Werten. (Und deshalb könnte GMT kurz nach 3:14 Uhr am 19. Januar 2038 für einige eine schlechte Zeit sein ...) Die Verwendung von Millisekunden ist eine modernere Praxis, da wir routinemäßig 64-Bit-Werte (beide ganzzahlig) werfen können und doppelte Genauigkeit IEEE-754) ...
TJ Crowder
5
Danke für den Code. Nur eine kleine Empfehlung beim Erstellen der Epochenbasis: Stellen Sie sicher, dass Sie den Millisekundenwert explizit auf 0 setzen. Dh var epoch = new DateTime (1970, 1, 1, 0 / * h * /, 0 / * m * /, 0 / * s * /, 0 / * ms * /, DateTimeKind.Utc); Wenn Sie es nicht explizit festlegen, scheint der Millisekundenwert 1 zu sein. Dies führte zu einigen Inkonsistenzen in meinen Tests.
Ctrlplusb
1
Sie sollten AddMillisecondsDouble NOT Float verwenden und verwenden. Andernfalls haben Sie eine falsche Zeit.
Axel
25
Sie möchten tatsächlich Millisekunden (Millisekunden) hinzufügen, nicht Sekunden. Wenn Sie Sekunden hinzufügen, erhalten Sie eine Ausnahme außerhalb des Bereichs.
Warum ist das so? epochconverter.com Es heißt, Sie addieren die Anzahl der Sekunden seit dem 1.1.970 nicht ms.
Jamie R Rytlewski
Wenn Sie von ms gehen, wollen Sie offensichtlich AddMillisund wenn Sie von Sekunden beginnen, wollen Sie offensichtlich AddSeconds.
Schuh
Ich hatte das gleiche Problem, dass ich bei der Verwendung von Sekunden immer wieder außer Reichweite war. Die Unix-Zeit, die ich zu konvertieren versuchte, war in Millisekunden. Ich dachte, es wäre in Sekunden. Ich denke, einige Unix-Zeit wird in Millisekunden gemessen.
DoodleKana
Die Unix-Zeit wird normalerweise in Sekunden ausgedrückt, aber 0,001 ist eine gültige Anzahl von Sekunden (= 1 ms). Verwenden Sie im Zweifelsfall nur die maximal mögliche Präzision.
Scott
9
Wenn Sie eine bessere Leistung wünschen, können Sie diese Version verwenden.
Verwenden Sie die Methode DateTimeOffset.ToUnixTimeMilliseconds (). Sie gibt die Anzahl der Millisekunden zurück, die seit 1970-01-01T00: 00: 00.000Z vergangen sind.
Dies wird nur mit Framework 4.6 oder höher unterstützt
var EPOCH =DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
DateTime.Ticks - Jeder Tick ist "einhundert Nanosekunden", was es zu einem zusätzlichen "Ding" macht, an das man sich erinnert. Wenn Sie beide weglassen .Ticks, erhalten Sie eine schöne TimeSpan-Instanz aus der DateTime-Subtraktion zurück.
/// <summary>/// DateTime as UTV for UnixEpoch/// </summary>publicstaticreadonlyDateTimeUnixEpoch=newDateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc);/// <summary>/// Per JWT spec:/// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time./// </summary>/// <param name="datetime">The DateTime to convert to seconds.</param>/// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks>/// <returns>the number of seconds since Unix Epoch.</returns>publicstaticlongGetIntDate(DateTime datetime){DateTime dateTimeUtc = datetime;if(datetime.Kind!=DateTimeKind.Utc){
dateTimeUtc = datetime.ToUniversalTime();}if(dateTimeUtc.ToUniversalTime()<=UnixEpoch){return0;}return(long)(dateTimeUtc -UnixEpoch).TotalSeconds;}
Danke zum Beispiel von JWT. Übrigens, um es zu benutzen, benutzen Sie einfach: using Microsoft.IdentityModel.Tokens; ... EpochTime.GetIntDate(dateTime);
Flüssigkeit
0
Wenn Sie eine Zeitstruktur (Sekunden, Mikrosekunden) konvertieren müssen, die enthält UNIX time, DateTimeohne an Genauigkeit zu verlieren, gehen Sie wie folgt vor:
Berücksichtigt dies Schaltjahre und Schaltsekunden usw.?
Jodrell
1
Um den vorherigen Kommentar zu erweitern, hier ein kurzes Video, das erklärt, warum die Zeit kompliziert ist und warum Sie es nicht selbst versuchen sollten: youtube.com/watch?v=-5wpm-gesOY
Antworten:
Ich nehme an, Sie meinen die Unix-Zeit , die als die Anzahl der Sekunden seit Mitternacht (UTC) am 1. Januar 1970 definiert ist.
quelle
AddXYZ
Methode.Die neueste Version von .Net (v4.6) hat gerade die integrierte Unterstützung für Unix- Zeitkonvertierungen hinzugefügt. Dies schließt sowohl die Unix-Zeit als auch die Unix-Zeit ein, die entweder durch Sekunden oder Millisekunden dargestellt wird.
DateTimeOffset
:DateTimeOffset
Unix-Zeit in Sekunden:DateTimeOffset
:DateTimeOffset
Unix-Zeit in Millisekunden:Hinweis: Diese Methoden konvertieren nach und von
DateTimeOffset
. Um eineDateTime
Darstellung zu erhalten, verwenden Sie einfach dieDateTimeOffset.DateTime
Eigenschaft:quelle
'DateTimeOffset' does not contain a definition for 'FromUnixTimeSeconds'
Wie würde ich das lösen?Mit aller Ehre für LukeH habe ich einige Erweiterungsmethoden für die einfache Verwendung zusammengestellt:
Beachten Sie den Kommentar von CodesInChaos unten, dass das obige
FromUnixTime
einDateTime
mit einemKind
von zurückgibtUtc
, was in Ordnung ist, aber das ObigeToUnixTime
ist viel verdächtiger, da es nicht berücksichtigt, welche Art vonDateTime
gegebendate
ist. Um zuzulassendate
,Kind
dass entwederUtc
oder istLocal
, verwenden SieToUniversalTime
:ToUniversalTime
konvertiert einLocal
(oderUnspecified
)DateTime
inUtc
.Wenn Sie beim Übergang von DateTime in die Epoche keine DateTime-Instanz für die Epoche erstellen möchten, können Sie außerdem Folgendes tun:
quelle
ToUnixTime
funktioniert nur richtig, wenn das Datum in Utc ist. Fügen Sie entweder einen Scheck hinzu oder konvertieren Sie ihn. (Ich persönlich bevorzuge den Scheck)milliseconds
nicht Sekunden arbeiten !!!AddMilliseconds
Double NOT Float verwenden und verwenden. Andernfalls haben Sie eine falsche Zeit.Sie möchten tatsächlich Millisekunden (Millisekunden) hinzufügen, nicht Sekunden. Wenn Sie Sekunden hinzufügen, erhalten Sie eine Ausnahme außerhalb des Bereichs.
quelle
AddMillis
und wenn Sie von Sekunden beginnen, wollen Sie offensichtlichAddSeconds
.Wenn Sie eine bessere Leistung wünschen, können Sie diese Version verwenden.
Aus einem schnellen Benchmark (BenchmarkDotNet) unter net471 erhalte ich folgende Nummer:
2x schneller gegen LukeHs Version (wenn die Leistung wichtig ist )
Dies ähnelt der internen Funktionsweise von DateTime.
quelle
Verwenden Sie die Methode DateTimeOffset.ToUnixTimeMilliseconds (). Sie gibt die Anzahl der Millisekunden zurück, die seit 1970-01-01T00: 00: 00.000Z vergangen sind.
Es ist hier gut dokumentiert DateTimeOffset.ToUnixTimeMilliseconds
Der andere Ausweg besteht darin, Folgendes zu verwenden
Um die EPOCH mit nur Sekunden zu erhalten, dürfen Sie verwenden
und Konvertieren der
Epoch
zuDateTime
dem folgende Verfahrenquelle
.Ticks
, erhalten Sie eine schöne TimeSpan-Instanz aus der DateTime-Subtraktion zurück.Sollte ToUniversalTime () für das DateTime-Objekt verwenden.
quelle
Ich verwende die folgenden Erweiterungsmethoden für die Epochenkonvertierung
quelle
Um sich keine Gedanken über die Verwendung von Millisekunden oder Sekunden zu machen, gehen Sie wie folgt vor:
Wenn die Epochenzeit in Sekunden angegeben ist, können Sie das Jahr 1972 nicht mit Millisekunden verlängern.
quelle
Wenn Sie 4.6 nicht verwenden, kann dies hilfreich sein. Quelle: System.IdentityModel.Tokens
quelle
using Microsoft.IdentityModel.Tokens; ... EpochTime.GetIntDate(dateTime);
Wenn Sie eine Zeitstruktur (Sekunden, Mikrosekunden) konvertieren müssen, die enthält
UNIX time
,DateTime
ohne an Genauigkeit zu verlieren, gehen Sie wie folgt vor:quelle
Seit .Net 4.6 und höher verwenden Sie bitte DateTimeOffset.Now.ToUnixTimeSeconds ()
quelle
Hier ist meine Lösung:
quelle