So konvertieren Sie ein JavaScript-Datumsobjekt in Ticks

79

Wie soll ich ein JavaScript-Datumsobjekt in Ticks konvertieren? Ich möchte die Häkchen verwenden, um das genaue Datum für meine C # -Anwendung nach der Synchronisierung der Daten zu erhalten.

Talha
quelle
1
Beachten Sie, dass Datum und Uhrzeit des Browsers auf eine beliebige Zeitzone eingestellt werden können, damit Ihre Daten nicht relativ zu UTC auf dem Server sind. Normalerweise kompensiere ich dies, indem ich die Server utcnowin Ticks (relativ zu 1970) in die Seite einfüge und die Differenz zwischen diesem Wert und +new Date()beim Seitenstart speichere . Dann können alle Daten / Zeiten um diesen Betrag verrechnet werden. Jeder Fehler ist dann nur auf die Seitenlatenz zurückzuführen.
Gone Coding

Antworten:

119

Wenn Sie Ihr DateTimeObjekt in universelle Ticks konvertieren möchten, verwenden Sie den folgenden Codeausschnitt:

var ticks = ((yourDateObject.getTime() * 10000) + 621355968000000000);

Es gibt 10000 Zecken in einer Millisekunde. Und 621.355.968.000.000.000 Ticks zwischen 1 st Jan 0001 und 1 st Januar 1970.

Scheich Ali
quelle
5
Dies bringt die Ticks, wenn Sie sich in C # befinden. Siehe die Antwort von pointy unten für eine Javascript-Methode.
Markieren Sie den
Ich muss zugeben, dass es mir nicht gefällt, aber es funktioniert :(
Milton
1
Die hinzugefügte Nummer funktioniert bei mir nicht. Sie gibt mir immer Zeit: 21: 00 am Vortag, aber diese (621356076000000000) funktioniert einwandfrei. Irgendeine Idee?
MuniR
In Google Chrome 56.0.2924.87 (64-Bit) ist der korrekte Wert (621356076000000000). Was ist also der Unterschied zwischen diesen beiden Werten?
Karpov
Auf welche Programmiersprache antworten Sie - c # oder JavaScript? Dh wo wird das umgesetzt?
Barrypicker
55

Der DateUrsprung des JavaScript- Typs ist die Unix-Epoche: Mitternacht am 1. Januar 1970.

Der DateTimeUrsprung des .NET- Typs liegt am 1. Januar 0001 um Mitternacht.

Sie können ein JavaScript- DateObjekt wie folgt in .NET-Ticks übersetzen :

var yourDate = new Date();  // for example

// the number of .net ticks at the unix epoch
var epochTicks = 621355968000000000;

// there are 10000 .net ticks per millisecond
var ticksPerMillisecond = 10000;

// calculate the total number of .net ticks for your date
var yourTicks = epochTicks + (yourDate.getTime() * ticksPerMillisecond);
LukeH
quelle
1
Ich mag diese Antwort zur Erklärung. Vielen Dank!
Pawel Cioch
4
(621355968e9 + (new Date()).getTime() * 1e4)Verdichtet diese 4 Zeilen, sobald Sie das Verständnis haben. Großer Anteil @LukeH
SliverNinja - MSFT
38

Wenn Sie mit "Häkchen" so etwas wie "Millisekunden seit der Epoche" meinen, können Sie ".getTime ()" aufrufen.

var ticks = someDate.getTime();

In der MDN-Dokumentation ist der zurückgegebene Wert ein

Ganzzahliger Wert, der die Anzahl der Millisekunden seit dem 1. Januar 1970 00:00:00 UTC (Unix-Epoche) darstellt.

Spitze
quelle
12
Zecken! = Millisekunden, also in C # Ein einzelnes Häkchen repräsentiert einhundert Nanosekunden
und
11

Erweitern der akzeptierten Antwort als Warum 635646076777520000wird hinzugefügt.

Javascript new Date().getTime() or Date.now()gibt die Anzahl der Millisekunden zurück, die von vergangen sind midnight of January 1, 1970.

In .NET ( Quelle unter RemarksAbschnitten)

Der Werttyp DateTime repräsentiert Datums- und Uhrzeitangaben mit Werten zwischen 00:00:00 (Mitternacht), 1. Januar 0001, Anno Domini (Common Era) und 23:59:59, 31. Dezember 9999 (CE) im Gregorianischen Kalender.

621355968000000000ist der Wert von Zecken von midnight Jan 1 01 CEbismidnight Jan 1 1970

Also in .NET

  Console.Write(new DateTime(621355968000000000))
  // output 1/1/1970 12:00:00 AM

Daher, um Javascript-Zeit in .Net-Ticks umzuwandeln

 var currentTime = new Date().getTime();

 // 10,000 ticks in 1 millisecond
 // jsTicks is number of ticks from midnight Jan 1, 1970
 var jsTicks = currentTime * 10000;

 // add 621355968000000000 to jsTicks
 // netTicks is number of ticks from midnight Jan 1, 01 CE
 var netTicks = jsTicks + 621355968000000000;

Jetzt in .NET

 Console.Write(new DateTime(netTicks))
 // output current time
Sami
quelle
6

Datum in JavaScript enthält auch Offset. Wenn Sie es loswerden müssen, verwenden Sie Folgendes:

return ((date.getTime() * 10000) + 621355968000000000) - (date.getTimezoneOffset() * 600000000);

Ich verwende Skeikhs Lösung und subtrahiere Ticks für 'Offset'.

michal.jakubeczy
quelle
2

Das sollte sein date.GetTime(). Beachten Sie, dass C # und Javascript unterschiedliche Anfangsdaten verwenden. Verwenden Sie daher Folgendes, um in C # DateTime zu konvertieren.

public static DateTime GetDateTime(long jsSeconds)
{
    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return unixEpoch.AddSeconds(jsSeconds);
}
Pieter
quelle