Jak przekonwertować obiekt daty JavaScript na znaczniki? Chcę użyć znaczników, aby uzyskać dokładną datę dla mojej aplikacji C # po synchronizacji danych.
Odpowiedzi:
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.
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);
(621355968e9 + (new Date()).getTime() * 1e4)skraca te 4 linie w dół, kiedy już zrozumiesz. Świetna akcja @LukeH
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).
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
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”.
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);
}
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.