Jak przekonwertować obiekt daty JavaScript na znaczniki

79

Jak przekonwertować obiekt daty JavaScript na znaczniki? Chcę użyć znaczników, aby uzyskać dokładną datę dla mojej aplikacji C # po synchronizacji danych.

Talha
źródło
1
Pamiętaj, że data / godzina przeglądarki może być ustawiona na dowolną strefę czasową, więc Twoje dane nie będą zależne od czasu UTC na serwerze. Zwykle kompensuję, wstawiając utcnowtiki serwera (w stosunku do roku 1970) do strony i przechowując różnicę między tą wartością a +new Date()początkiem strony. Wtedy cała data / godzina może zostać przesunięta o tę kwotę. Każdy błąd sprowadza się wtedy tylko do opóźnienia strony.
Gone Coding

Odpowiedzi:

119

Jeśli chcesz przekonwertować swój DateTimeobiekt na uniwersalne tiki, użyj następującego fragmentu kodu:

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

W milisekundach jest 10000 tyknięć. I 621.355.968.000.000.000 kleszcze między 1 st stycznia 0001 i 1 st stycznia 1970 r.

Sheikh Ali
źródło
5
To powoduje zaznaczenie, gdy jesteś w C #. Zobacz odpowiedź pointy poniżej, aby zapoznać się z JavaScriptem.
znak
Muszę przyznać, że mi się to nie podoba, ale działa :(
Milton
1
dodany numer nie działa ze mną zawsze daje mi czas: 21:00 poprzedniego dnia, ale ten (621356076000000000) działa dobrze, jakikolwiek pomysł ??
MuniR
w Google Chrome 56.0.2924.87 (64-bit) poprawna wartość to (621356076000000000), więc jaka jest różnica między tymi dwiema wartościami?
okarpov
Na jaki język programowania jest Twoja odpowiedź - C # czy JavaScript? To znaczy, gdzie jest to realizowane?
barrypicker
55

Typ JavaScript Datepochodzi z epoki Uniksa: północ 1 stycznia 1970 roku.

Typ .NET DateTimepochodzi o północy 1 stycznia 0001.

Możesz przetłumaczyć Dateobiekt JavaScript na znaczniki .NET w następujący sposób:

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
źródło
1
Podoba mi się ta odpowiedź za wyjaśnienie. Dzięki!
Paweł Cioch
4
(621355968e9 + (new Date()).getTime() * 1e4)skraca te 4 linie w dół, kiedy już zrozumiesz. Świetna akcja @LukeH
SliverNinja - MSFT
39

Jeśli przez „tiki” masz na myśli coś w rodzaju „milisekund od epoki”, możesz wywołać „.getTime ()”.

var ticks = someDate.getTime();

Z dokumentacji MDN zwracana wartość to

Wartość całkowita reprezentująca liczbę milisekund od 1 stycznia 1970 00:00:00 UTC (Epoka Unix).

Spiczasty
źródło
12
ticks! = milisekundy, więc w C # pojedynczy tik reprezentuje sto nanosekund
amd,
11

Rozszerzanie zaakceptowanej odpowiedzi jako przyczyny 635646076777520000.

Javascript new Date().getTime() or Date.now()zwróci liczbę milisekund, które upłynęły od midnight of January 1, 1970.

W .NET ( źródło w Remarkssekcjach)

Typ wartości DateTime reprezentuje daty i godziny o wartościach od 00:00:00 (północ), 1 stycznia 0001 Anno Domini (era powszechna) do 23:59:59, 31 grudnia 9999 AD (CE) w języku gregoriańskim kalendarz.

621355968000000000jest wartością kleszczy od midnight Jan 1 01 CEdomidnight Jan 1 1970

Tak więc w .NET

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

Stąd przekonwertować czas javascript na ticky .Net

 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;

Teraz w .NET

 Console.Write(new DateTime(netTicks))
 // output current time
Sami
źródło
6

Data w JavaScript zawiera również przesunięcie. Jeśli chcesz się go pozbyć, użyj następujących:

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

Używam rozwiązania Skeikha i odejmuję znaczniki dla „przesunięcia”.

michal.jakubeczy
źródło
2

Tak powinno być date.GetTime(). Należy pamiętać, że C # i JavaScript używają różnych dat początkowych, więc użyj czegoś takiego, aby przekonwertować C # DateTime.

public static DateTime GetDateTime(long jsSeconds)
{
    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return unixEpoch.AddSeconds(jsSeconds);
}
Pieter
źródło