variable obtener hora formato fecha javascript timezone utc

formato - obtener hora utc javascript



¿Cómo obtengo una indicación de fecha y hora UTC en JavaScript? (15)

Al escribir una aplicación web, tiene sentido almacenar (en el lado del servidor) todas las fechas en DB como marcas de tiempo UTC.

Me quedé asombrado cuando noté que no se podía hacer mucho en términos de manipulación de la zona horaria en JavaScript.

Extendí el objeto Date un poco. ¿Tiene esta función sentido? Básicamente, cada vez que envío algo al servidor, va a 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(); }

Me parece un poco intrincado. Y tampoco estoy tan seguro del rendimiento.


  1. Las fechas construidas de esa manera usan la zona horaria local, por lo que la fecha construida es incorrecta. Establecer la zona horaria de un determinado objeto de fecha es construirlo a partir de una cadena de fecha que incluye la zona horaria. (Tuve problemas para hacerlo funcionar en un navegador Android más antiguo).

  2. Tenga en cuenta que getTime() devuelve milisegundos, no segundos.

Para una marca de tiempo UTC / Unix, lo siguiente debería ser suficiente:

Math.floor((new Date()).getTime() / 1000)

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:

new Date(Y, M, D, h, m, s)

Esa entrada se trata como hora local . Si se pasa la hora UTC , los resultados serán diferentes. Observe (estoy en GMT +02: 00 en este momento, y son las 07:50):

> var d1 = new Date(); > d1.toUTCString(); "Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time > Math.floor(d1.getTime()/ 1000) 1332049834 > var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() ); > d2.toUTCString(); "Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0! > Math.floor(d2.getTime()/ 1000) 1332042634

También tenga en cuenta que getUTCDate() no se puede sustituir por getUTCDay() . Esto es porque getUTCDate() devuelve el día del mes ; mientras que getUTCDay() devuelve el día de la semana .


Como new Date().toUTCString() devuelve una cadena como "Wed, 11 Oct 2017 09:24:41 GMT" , puede "Wed, 11 Oct 2017 09:24:41 GMT" los últimos 3 caracteres y pasar la cadena en rodajas a la new Date() :

new Date() // Wed Oct 11 2017 11:34:33 GMT+0200 (CEST) new Date(new Date().toUTCString().slice(0, -3)) // Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)


Creo que esta es una mejor solución

// UTC milliseconds new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime() // UTC seconds new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0


Creo que esto es lo que estás esperando ...

var currTimestamp = Date.now(), //1482905176396 utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"

Ahora,

new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript


De hecho, creo que los valores de fecha en js son mucho mejores que los objetos C # DateTime. Los objetos C # DateTime tienen una propiedad Kind, pero no una zona horaria subyacente estricta como tal, y las conversiones de zona horaria son difíciles de rastrear si está convirtiendo entre dos tiempos no UTC y no locales. En js, todos los valores de fecha tienen un valor de UTC subyacente que se transmite y se conoce independientemente de las conversiones de zona horaria o más remotas que se realicen. 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 las fechas en js con prueba y error en lugar de leer las especificaciones. El uso de algo como iso8601.js resuelve este comportamiento variable al definir una única implementación del objeto Date.

Por defecto, la especificación dice que puede crear fechas con un formato de fecha extendido ISO 8601 como

var someDate = new Date(''2010-12-12T12:00Z'');

Entonces puede inferir la hora UTC exacta de esta manera.

Cuando desee pasar el valor de la fecha de vuelta al servidor, debería llamar

someDate.toISOString();

o si prefiere trabajar con una marca de tiempo de milisegundos (cantidad de milisegundos desde el UTC del 1 de enero de 1970)

someDate.getTime();

ISO 8601 es un estándar. No se puede confundir 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 tendrá que lidiar con las conversiones de tiempo local usted mismo . Los valores de tiempo local existen exclusivamente para el beneficio del usuario, y los valores de fecha se muestran por defecto en su hora local. Todas las manipulaciones horarias locales le permiten mostrar algo sensible al usuario y convertir cadenas a partir de la entrada del usuario. Es una buena práctica convertir a UTC tan pronto como sea posible, y el objeto Date js lo hace bastante trivial.

En el lado negativo, no hay mucho margen para forzar la zona horaria o la configuración regional para el cliente (que yo sepa), lo que puede ser molesto para la configuración específica del sitio web, pero creo que el razonamiento detrás de esto es que es un usuario configuración que no debe ser tocada

Entonces, en resumen, la razón por la cual no hay mucho apoyo nativo para la manipulación de la zona horaria es porque simplemente no quieres hacerlo.


EDITAR: El código siguiente NO funciona. Siempre asumí que la nueva Fecha (). GetTime () devolvió la cantidad de segundos desde el 1 de enero de 1970 EN EL ACTUAL TIMEZONE. Este no es el caso: getTime () devuelve la cantidad de segundos en UTC. Por lo tanto, el código a continuación no se ajusta excesivamente. ¡Gracias a todos!]

En primer lugar, gracias por tus ideas fantásticas. Supongo que mi pregunta tenía el título equivocado ... debería haber sido "Obtener la indicación de fecha y hora UTC Unix para una fecha existente".

Entonces, si tengo un objeto de fecha:

var d = new Date(2009,01,31)

Estaba buscando una función que me diga "La marca de tiempo UTC Unix".

Esta función parece ser el verdadero truco:

Date.prototype.getUTCUnixTime = function (){ return Math.floor( new Date( this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds() ).getTime() / 1000); }

Tenga en cuenta que funciona en "esto" Esto significa que puedo hacer:

var n = new Date(2008,10,10) ... ... n.getUTCUnixTime();

Y obtenga la cantidad de segundos desde el 1 de enero de 1970 en tiempo Unix. ¿Derecha?

Es un poco loco, para mí, que Javascript almacene todo en horas UTC, pero luego para obtener ese número tengo que crear un nuevo objeto Date pasando los getters individuales UTC y finalmente llamar a getTime () para eso ...

Merc.


Esto devolverá la marca de tiempo en UTC:

var utc = new Date(new Date().toUTCString()).getTime();


La forma más fácil de obtener la hora UTC en un formato convencional es la siguiente:

new Date().toISOString() "2016-06-03T23:15:33.008Z"


Me sorprende la complejidad de esta pregunta.

Estos son todos idénticos, y sus valores enteros todos === EPOCH tiempo: D

console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);

No me creas, pago y envío: http://www.epochconverter.com/


Por lo general, no es necesario realizar gran parte de la "manipulación de zona horaria" en el lado del cliente. Como regla, trato de almacenar y trabajar con fechas UTC, en forma de ticks o " 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 compensaciones y, sobre todo, le quita el dolor de cabeza de los ajustes de "Horario de verano". Aquí hay un pequeño código de JavaScript que yo uso.

Para obtener la hora UTC actual:

function getCurrentTimeUTC() { //RETURN: // = number of milliseconds between current UTC time and midnight of January 1, 1970 var tmLoc = new Date(); //The offset is in minutes -- convert it to ms return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000; }

Entonces, lo que generalmente necesitaría es formatear la fecha / hora para el usuario final para su zona horaria local y formato. A continuación, se ocupa de todas las complejidades de los formatos de fecha y hora en la computadora del cliente:

function formatDateTimeFromTicks(nTicks) { //''nTicks'' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted date/time return new Date(nTicks).toLocaleString(); } function formatDateFromTicks(nTicks) { //''nTicks'' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted date return new Date(nTicks).toLocaleDateString(); } function formatTimeFromTicks(nTicks) { //''nTicks'' = number of milliseconds since midnight of January 1, 1970 //RETURN: // = Formatted time return new Date(nTicks).toLocaleTimeString(); }

Entonces el siguiente ejemplo:

var ticks = getCurrentTimeUTC(); //Or get it from the server var __s = "ticks=" + ticks + ", DateTime=" + formatDateTimeFromTicks(ticks) + ", Date=" + formatDateFromTicks(ticks) + ", Time=" + formatTimeFromTicks(ticks); document.write("<span>" + __s + "</span>");

Devuelve lo siguiente (para mi ubicación en inglés de EE. UU.):

ticks = 1409103400661, DateTime = 26/8/2014 6:36:40 PM, fecha = 26/8/2014, hora = 6: 36: 40 pm


Quiero dejar en claro que la nueva Fecha (). GetTime () de hecho devuelve un valor UTC, por lo que es una manera muy útil de almacenar y administrar las fechas de una manera que es independiente de las horas localizadas.

En otras palabras, no se moleste con todas las funciones de UTC javascript. En su lugar, solo use Date.getTime ().

Más información sobre la explicación está aquí: If javascript "(new Date ()). GetTime ()" se ejecuta desde 2 zonas horarias diferentes.


Sí, no necesitas hacer tanto; suponiendo que te entiendo correctamente, solo quieres el método toUTCString .

var UTCstring = (new Date()).toUTCString();

Sin embargo, recuerde que los valores de fecha que obtiene se basan en el reloj de la máquina del cliente, no en su servidor. Si necesita valores precisos para estas fechas (por ejemplo, para ordenar correctamente cuando esta o aquella acción se realizó en relación con la acción de otro usuario), no puede confiar en la biblioteca de fecha del lado del cliente, de todos modos, y necesita calcular la fechas del lado del servidor según el momento en que el cliente se comunicó contigo.

Recuerde también que, básicamente, el cliente puede modificar todo su código del lado del cliente y devolver los valores maliciosos, solo puede garantizar el código en el lado del servidor: trate al cliente como un posible atacante.


Si desea un trazador de líneas único , la marca de tiempo UTC Unix se puede crear en JavaScript como:

var currentUnixTimestap = ~~(+new Date() / 1000);

Esto tendrá en cuenta la zona horaria del sistema. Básicamente es el tiempo transcurrido en segundos desde la época.

Cómo funciona:

  • Crear objeto de fecha: new Date() .
  • Convierta a marca de tiempo agregando unary + antes de la creación del objeto para convertirlo a un timestamp integer de timestamp integer . : +new Date() .
  • Convertir milisegundos en segundos: +new Date() / 1000
  • Use tildes dobles para redondear el valor a entero. : ~~(+new Date())

También podría hacerlo utilizando getTimezoneOffset y getTime,

x = new Date() var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;


Yo uso lo siguiente:

Date.prototype.getUTCTime = function(){ return this.getTime()-(this.getTimezoneOffset()*60000); };

Una vez que hayas definido este método, puedes hacer:

var utcTime = new Date().getUTCTime();