Al escribir una aplicación web, tiene sentido almacenar (lado del servidor) todas las fechas en el DB como marcas de tiempo UTC.
Me sorprendió cuando noté que no se podía hacer mucho de forma nativa en términos de manipulación de zona horaria en JavaScript.
Extendí el objeto Fecha un poco. ¿Tiene sentido esta función? Básicamente, cada vez que envíe algo al servidor, será una marca de tiempo formateada con esta función ...
¿Puedes ver algún problema importante aquí? ¿O tal vez una solución desde un ángulo diferente?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
Simplemente me parece un poco complicado. Y tampoco estoy tan seguro sobre el rendimiento.
javascript
timezone
utc
Merc
fuente
fuente
new Date().toString()
le mostrará la representación horaria actual de la zona horaria,new Date().toUTCString()
le mostrará la reproducción de la hora UTC, pero siemprenew Date().getTime()
es UTC , porque eso es lo que la hora Unix se define como: "La hora Unix (también conocida como hora POSIX o hora de época) es un sistema para describir instantes en el tiempo, definido como el número de segundos que han transcurrido desde las 00:00:00 hora universal coordinada (UTC), jueves 1 de enero de 1970, sin contar los segundos bisiestos ".Respuestas:
Las fechas construidas de esa manera usan la zona horaria local, haciendo que la fecha construida sea incorrecta. Establecer la zona horaria de un determinado objeto de fecha es construirlo a partir de una cadena de fecha que incluya la zona horaria. (Tuve problemas para hacer que eso funcione en un navegador Android anterior).
Tenga en cuenta que
getTime()
devuelve milisegundos, no segundos simples.Para una marca de tiempo UTC / Unix, lo siguiente debería ser suficiente:
Factorizará el desplazamiento de la zona horaria actual en el resultado. Para una representación de cadena, la respuesta de David Ellis funciona.
Para aclarar:
Esa entrada se trata como hora local . Si se pasa la hora UTC , los resultados serán diferentes. Observar (estoy en GMT +02: 00 en este momento, y son las 07:50):
También tenga en cuenta que
getUTCDate()
no se puede sustituir porgetUTCDay()
. Esto se debe a quegetUTCDate()
devuelve el día del mes ; mientras que,getUTCDay()
devuelve el día de la semana .fuente
new Date()
, eso crea una nueva fecha a partir de su entrada UTC pero la trata como fecha / hora local. 2) Sí, debe usarMath.floor(this.getTime() / 1000)
en este caso.También podría hacerlo utilizando getTimezoneOffset y getTime,
fuente
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Parecett.getTime() - tt.getTimezoneOffset()
correcto paraGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
que incluye una zona horaria ... queLa forma más fácil de obtener la hora UTC en un formato convencional es la siguiente:
fuente
De hecho, creo que los valores de fecha en js son mucho mejores que decir los objetos C # DateTime. Los objetos C # DateTime tienen una propiedad Kind, pero no hay una zona horaria subyacente estricta como tal, y las conversiones de zona horaria son difíciles de rastrear si está convirtiendo entre dos horas no UTC y no locales. En js, todos los valores de fecha tienen un valor UTC subyacente que se transmite y se conoce independientemente de las conversiones de zona horaria o de desacuerdo que realice. Mi mayor queja sobre el objeto Date es la cantidad de comportamiento indefinido que los implementadores del navegador han elegido incluir, lo que puede confundir a las personas que atacan fechas en js con prueba y error que leer la especificación. El uso de algo como iso8601.js resuelve este comportamiento variable definiendo una única implementación del objeto Date.
Por defecto, la especificación dice que puede crear fechas con un formato de fecha ISO 8601 extendido como
Entonces puede inferir la hora UTC exacta de esta manera.
Cuando desee pasar el valor de la fecha al servidor, llame
o si prefiere trabajar con una marca de tiempo de milisegundos (número de milisegundos desde el 1 de enero de 1970 UTC)
ISO 8601 es un estándar. No puede confundirse sobre lo que significa una cadena de fecha si incluye el desplazamiento de fecha. Lo que esto significa para usted como desarrollador es que nunca tiene que lidiar con las conversiones de hora local . Los valores de hora local existen exclusivamente para el beneficio del usuario, y los valores de fecha se muestran por defecto en su hora local. Todas las manipulaciones de hora local le permiten mostrar algo sensible al usuario y convertir cadenas de entrada del usuario. Es una buena práctica convertir a UTC tan pronto como sea posible, y el objeto js Date lo hace bastante trivial.
En el lado negativo, no hay mucho margen para forzar la zona horaria o la ubicación del cliente (que yo sepa), lo que puede ser molesto para la configuración específica del sitio web, pero supongo que el razonamiento detrás de esto es que es un usuario configuración que no debe ser tocada.
En resumen, la razón por la que no hay mucho soporte nativo para la manipulación de la zona horaria es porque simplemente no quieres hacerlo.
fuente
Por lo general, no necesita hacer mucha "manipulación de la zona horaria" en el lado del cliente. Como regla, trato de almacenar y trabajar con fechas UTC, en forma de
ticks
" número de milisegundos desde la medianoche del 1 de enero de 1970 ". Esto realmente simplifica el almacenamiento, la clasificación, el cálculo de las compensaciones y, sobre todo, lo libera del dolor de cabeza de los ajustes del "horario de verano". Aquí hay un pequeño código JavaScript que uso.Para obtener la hora UTC actual:
Entonces, lo que generalmente necesitaría es formatear la fecha / hora para el usuario final para su zona horaria y formato local . Lo siguiente se ocupa de todas las complejidades de los formatos de fecha y hora en la computadora cliente:
Entonces el siguiente ejemplo:
Devuelve lo siguiente (para mi idioma inglés de EE. UU.):
fuente
getTimezoneOffset
valor en sugetCurrentTimeUTC
función, en realidad está devolviendo un punto en el tiempo diferente. El resultado de yagetTime
está en UTC.tmLoc.getTime()
es una compensación con respecto a la hora local. Es fácil verificar si tiene acceso a cualquier cosa que ejecute JavaScript.getTime
, que lo señala al "valor de tiempo" definido en §15.9.5 , que es aPrimitiveValue
, como se establece en §15.9.3.3 explícitamente como UTC.tmLoc
víanew Date()
, entonces es lo mismo. La zona horaria afectará la salida de la cadenatmLoc.toString()
y elementos similares, pero no afectarátmLoc.getTime()
Eso siempre es solo una cantidad de milisegundos desde la medianoche 1970-01-01 en UTC.//The offset is in minutes -- convert it to ms
Creo que esta es una mejor solución.
fuente
Si desea una línea única , la marca de tiempo UTC Unix se puede crear en JavaScript como:
Esto tendrá en cuenta la zona horaria del sistema. Es básicamente el tiempo transcurrido en segundos desde la época.
Cómo funciona:
new Date()
.unary +
antes de la creación del objeto para convertirlotimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
fuente
tilde
, notilda
(sic). Lamentablemente no me permite eliminar un error tipográfico, tengo que hacer al menos 6 ediciones de caracteres. Smooth, Stackexchange, smoothQuiero dejar en claro que el nuevo Date (). GetTime () de hecho devuelve un valor UTC, por lo que es una forma realmente útil de almacenar y administrar fechas de una manera que sea independiente de los tiempos localizados.
En otras palabras, no te molestes con todas las funciones de JavaScript UTC. En su lugar, solo usa Date.getTime ().
Aquí encontrará más información sobre la explicación: si javascript "(new Date ()). GetTime ()" se ejecuta desde 2 zonas horarias diferentes.
fuente
Yo uso lo siguiente:
Una vez definido este método puedes hacer:
fuente
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
devuelve un desplazamiento UTC, restando el desplazamiento de la zona horaria local lo hace local, no UTC, por lo que getUTCTime devuelve un desplazamiento local, no UTC.Me sorprende lo compleja que se ha vuelto esta pregunta.
Todos estos son idénticos, y todos sus valores enteros === Tiempo EPOCH: D
No me creas, paga: http://www.epochconverter.com/
fuente
Dado que
new Date().toUTCString()
devuelve una cadena como"Wed, 11 Oct 2017 09:24:41 GMT"
puede, puede cortar los últimos 3 caracteres y pasar la cadena cortada anew Date()
:fuente
EDITAR: El siguiente código NO funciona. Siempre asumí que la nueva Fecha (). GetTime () devolvió el número de segundos desde el 1 de enero de 1970 EN LA TIEMPO ACTUAL. Este no es el caso: getTime () devuelve el número de segundos en UTC. Entonces, el siguiente código hace un sobreajuste bruto. ¡Gracias a todos!]
En primer lugar, gracias por sus fantásticas ideas. Supongo que mi pregunta tenía el título incorrecto ... debería haber sido "Obtener la marca de tiempo de UTC Unix para una fecha existente".
Entonces, si tengo un objeto de fecha:
Estaba buscando una función que me dijera "The UTC Unix Timestamp".
Esta función parece ser el verdadero truco:
Tenga en cuenta que funciona en "esto" Esto significa que puedo hacer:
Y obtenga el número de segundos desde el 1 de enero de 1970 en tiempo Unix. ¿Correcto?
Para mí es un poco loco que Javascript almacene todo en tiempos UTC, pero luego para obtener ese número, tengo que crear un nuevo objeto Date que pase los captadores UTC individuales y finalmente llamar a getTime () para eso ...
Merc.
fuente
getUTCUnixTime
obtiene el momento equivocado, y JavaScript hace proporcionar una forma sencilla de obtener la marca de tiempo Unix de unDate
objeto - utilizando elgetTime
método. Ver todas las otras respuestas.Creo que esto es lo que esperas ...
Ahora,
fuente
Una vez que hagas esto
Ya es la marca de tiempo UTC
Lo probé en https://www.unixtimestamp.com/index.php
fuente
Usando day.js
En el navegador:
En node.js:
Obtiene una marca de tiempo UTC unix sin milisegundos.
fuente
Esto devolverá la marca de tiempo en UTC:
fuente
new Date(new Date().toUTCString())
da Mier Oct 04 2017 07:20:14 GMT + 0200 (GMT + 02: 00)