Cómo convertir un objeto de fecha de JavaScript en ticks

79

¿Cómo debo convertir el objeto de fecha de JavaScript en ticks? Quiero usar los ticks para obtener la fecha exacta de mi aplicación C # después de la sincronización de datos.

Talha
fuente
1
Tenga en cuenta que la fecha / hora del navegador se puede establecer en cualquier zona horaria, por lo que sus datos no serán relativos a UTC en el servidor. Normalmente lo compenso inyectando los utcnowticks del servidor (en relación con 1970) en la página y almacenando la diferencia entre ese valor y +new Date()al inicio de la página. Entonces toda la fecha / hora se puede compensar por esa cantidad. Cualquier error se reduce a la latencia de la página.
Gone Coding

Respuestas:

119

Si desea convertir su DateTimeobjeto en ticks universales, utilice el siguiente fragmento de código:

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

Hay 10000 tics en un milisegundo. Y 621.355.968.000.000.000 garrapatas entre 1 st Ene 0001 y el 1 er enero 1970.

Sheikh Ali
fuente
5
Esto obtiene los tics cuando estás en C #. Vea la respuesta de Pointy a continuación para obtener una forma de JavaScript.
marca el
Tengo que admitir que no me gusta, pero funciona :(
Milton
1
el número agregado no funciona conmigo, siempre me da tiempo: 21:00 del día anterior, pero este (621356076000000000) funciona bien, ¿alguna idea?
MuniR
en Google Chrome 56.0.2924.87 (64 bits) el valor correcto es (621356076000000000), entonces, ¿cuál es la diferencia entre estos dos valores?
okarpov
¿Para qué lenguaje de programación es su respuesta, c # o JavaScript? Es decir, ¿dónde se implementa esto?
barrypicker
55

El Dateorigen del tipo de JavaScript es la época de Unix: la medianoche del 1 de enero de 1970.

El DateTimeorigen del tipo .NET es la medianoche del 1 de enero de 0001.

Puede traducir un Dateobjeto JavaScript a .NET ticks de la siguiente manera:

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
fuente
1
Me gusta esta respuesta para una explicación. ¡Gracias!
Pawel Cioch
4
(621355968e9 + (new Date()).getTime() * 1e4)condensa estas 4 líneas una vez que tenga la comprensión. Gran participación @LukeH
SliverNinja - MSFT
39

Si por "ticks" te refieres a "milisegundos desde la época", puedes llamar a ".getTime ()".

var ticks = someDate.getTime();

De la documentación de MDN , el valor devuelto es un

Valor entero que representa el número de milisegundos desde el 1 de enero de 1970 a las 00:00:00 UTC (época de Unix).

Puntiagudo
fuente
12
ticks! = milisegundos, por lo que en C # Un solo tick representa cien nanosegundos
amd
11

Ampliando la respuesta aceptada como por qué 635646076777520000se agrega.

Javascript new Date().getTime() or Date.now()devolverá el número de milisegundos pasados midnight of January 1, 1970.

En .NET ( fuente en Remarkssecciones)

El tipo de valor DateTime representa fechas y horas con valores que van desde las 00:00:00 (medianoche), el 1 de enero de 0001 Anno Domini (era común) hasta las 11:59:59 p.m., el 31 de diciembre de 9999 d.C. (CE) en el gregoriano. calendario.

621355968000000000es el valor de los ticks de midnight Jan 1 01 CEamidnight Jan 1 1970

Entonces, en .NET

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

Por lo tanto, convertir el tiempo de JavaScript a .Net ticks

 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;

Ahora, en .NET

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

La fecha en JavaScript también contiene desplazamiento. Si necesita deshacerse de él, use lo siguiente:

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

Utilizo la solución de Skeikh y resto ticks para 'offset'.

michal.jakubeczy
fuente
2

Eso debería ser date.GetTime(). Tenga en cuenta que C # y Javascript usan diferentes fechas iniciales, así que use algo como esto para convertir a C # DateTime.

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