Supongamos que un usuario de su sitio web ingresa un rango de fechas.
2009-1-1 to 2009-1-3
Debe enviar esta fecha a un servidor para que se procese, pero el servidor espera que todas las fechas y horas estén en UTC.
Ahora suponga que el usuario se encuentra en Alaska o Hawai o Fiji. Como se encuentran en una zona horaria bastante diferente de UTC, el intervalo de fechas debe convertirse en algo como esto:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Con el objeto Fecha de JavaScript, ¿cómo convertiría el primer intervalo de fechas "localizado" en algo que el servidor comprenderá?
javascript
date
utc
dthrasher
fuente
fuente
Respuestas:
Fuente: documentos web de MDN
El formato que necesita se crea con el
.toISOString()
método. Para navegadores más antiguos (es decir, 8 y menores), que no admiten este método de forma nativa, la cuña se puede encontrar aquí :Esto le dará la capacidad de hacer lo que necesita:
Para el trabajo de Timezone , moment.js y moment.js timezone son herramientas realmente invaluables ... especialmente para navegar por zonas horarias entre el cliente y el servidor javascript.
fuente
toISOString
se convierte correctamente a UTC.[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
También en el ejemplo muestran que el desplazamiento se tiene en cuenta cuando se llama toISOStringSimple y estupido
fuente
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
lugar de (incorrecto)now_utc.toString()
.Aquí está mi método:
El
utc
objeto resultante no es realmente una fecha UTC, sino una fecha local desplazada para coincidir con la hora UTC (ver comentarios). Sin embargo, en la práctica hace el trabajo.fuente
Date.now()
da la hora local y no la hora UTC, y esta solución me parece la más simple. Al menos en mi caso donde quiero tiempo UNIX y no una cadena bien formateada. (la única diferencia era que multiplicaría por60 * 1000
ser más claro :))now.toString()
conutc.toString()
: no hay cambio de zona horaria, sino alteración del tiempo, que es algo muy diferente. Sin embargo, una solución más limpia sería mucho más compleja (supongo que sí), y este código hace el trabajo en la gran mayoría de los casos, siempre y cuando no se trabaje más con las zonas horarias. Me hizo recordar los golpes de pato : algo diferente pero hecho para comportarse igual. También tenga en cuenta que el código de DrunkCoder tiene el mismo problema.fuente
Convierte a ISO sin cambiar la fecha / hora
Convierte a ISO con un cambio en la fecha / hora (la fecha / hora cambiará)
Enlace de violín
fuente
Los navegadores pueden diferir, y también debe recordar no confiar en ninguna información generada por el cliente, dicho esto, la siguiente declaración me funciona (Google Chrome v24 en Mac OS X 10.8.2)
var utcDate = new Date(new Date().getTime());
editar: "¿Cómo es esto diferente de solo
new Date()
?" ver aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateAgregar el 60000 * Date.getTimezoneOffset () como han dicho las respuestas anteriores es incorrecto. Primero, debe pensar que todas las fechas / horas ya son UTC con un modificador de zona horaria para fines de visualización.
Una vez más, los navegadores pueden diferir, sin embargo, Date.getTime () devuelve el número de milisegundos desde 1970-01-01 UTC / GMT. Si crea una nueva Fecha usando este número como lo hice anteriormente, será UTC / GMT. Sin embargo, si lo visualiza llamando a .toString (), parecerá estar en su zona horaria local porque .toString () usa su zona horaria local, no la zona horaria del objeto Date en el que se llama.
También descubrí que si llama a .getTimezoneOffset () en una fecha, le devolverá su zona horaria local, no la zona horaria del objeto de fecha en el que lo llamó (sin embargo, no puedo verificar que sea estándar).
En mi navegador, agregar 60000 * Date.getTimezoneOffset () crea un DateTime que no es UTC . Sin embargo, cuando se muestra en mi navegador (por ejemplo: .toString ()), muestra una fecha y hora en mi zona horaria local que sería la hora UTC correcta si se ignora la información de la zona horaria.
fuente
new Date()
, ni la marca de tiempo ni la zona horaria cambiannew Date().getTime()
siempre devolverá una marca de tiempo que sea independiente de la zona horaria. No hay una marca de tiempo asociada hasta que intente formatearlo en algo diferente al número de milisegundos desde la época de Unix.new Date(new Date().getTime())
devuelve exactamente el mismo valor quenew Date()
. ¿Puede explicar en qué sentido su respuesta proporciona un valor distintonew Date()
?new Date("5/19/2014").getTime()
. El constructor Fecha creó una fecha con un desplazamiento de +7. En el servidor (C #), agrego el valor publicado como milisegundos a unix epochnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. El resultado es5/19/2014 7:00:00 AM
. Entonces parece que getTime () da la cantidad de milisegundos, incluido mi desplazamiento UTC.new Date(new Date().getTime())
no funciona. Puedo confirmar quenew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
efectivamente produce tiempo UTC. Si no lo usaDate.UTC(...)
, obtendrá fechas en UTC compensadas en su zona horaria.fuente
Otra solución para convertir a UTC y mantenerlo como un objeto de fecha: (Funciona eliminando la parte 'GMT' del final de la cadena formateada y luego volviéndola a colocar en el constructor de Fecha)
Necesitaba hacer esto para interactuar con una biblioteca de selector de fecha y hora. Pero en general es una mala idea trabajar con fechas de esta manera.
Los usuarios generalmente desean trabajar con fechas y horas en su hora local, por lo que puede actualizar el código del lado del servidor para analizar las cadenas de fecha y hora con las compensaciones correctamente, luego convertir a UTC (la mejor opción) o convertir a una cadena UTC del lado del cliente antes de enviar al servidor (como en la respuesta de Will Stern)
fuente
¿Estás tratando de convertir la fecha en una cadena como esa?
Haría una función para hacer eso y, aunque es un poco controvertido, lo agregaría al prototipo de Date. Si no se siente cómodo con eso, puede ponerlo como una función independiente, pasando la fecha como parámetro.
Si lo necesitaba en tiempo UTC, simplemente reemplace todas las funciones get * con getUTC *, por ejemplo: getUTCFullYear, getUTCMonth, getUTCHours ... y luego simplemente agregue "+00: 00" al final en lugar del desplazamiento de la zona horaria del usuario.
fuente
String(temp)
desde la otra manera ("" + temp
) se informa como un error JSLint en estos días.toISOString
métodoDebería funcionar en la mayoría de los navegadores más nuevos. vuelve
2012-07-28T00:00:00.000Z
en Firefox 6.0fuente
Mi recomendación al trabajar con fechas es analizar la fecha en campos individuales a partir de la entrada del usuario. Puedes usarlo como una cadena completa, pero estás jugando con fuego.
JavaScript puede tratar dos fechas iguales en diferentes formatos de manera diferente.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Nunca hagas nada como:
Una vez que haya analizado su fecha en sus campos individuales a partir de la entrada del usuario, cree un objeto de fecha. Una vez que se crea el objeto de fecha, conviértalo a UTC agregando el desplazamiento de zona horaria. No puedo enfatizar lo importante que es usar el desplazamiento desde el objeto de fecha debido a DST (sin embargo, esa es otra discusión para mostrar por qué).
Ahora puede pasar la fecha al servidor en hora UTC. Nuevamente, recomendaría no usar cadenas de fecha. Páselo al servidor desglosado a la granularidad más baja que necesite, por ejemplo, año, mes, día, minuto o como un valor como milisegundos de la época de Unix.
fuente
Si tiene muchas citas, vale la pena usar moment.js ( http://momentjs.com ). El método para convertir a UTC sería:
Puede usar el formato para cambiar su fecha a cualquier formato que desee:
También hay opciones de compensación en este momento, pero hay una biblioteca complementaria adicional para tratar con la zona horaria ( http://momentjs.com/timezone/ ). La conversión de tiempo sería tan simple como esta:
fuente
moment(yourTime).utc()
ymoment.utc(yourTime)
? Usualmente uso el último.Mi solución mantiene la fecha igual sin importar la zona horaria establecida en el lado del cliente. Quizás alguien lo encuentre útil.
Mi caso de uso:
Estoy creando una aplicación de tareas, donde estableces la fecha de tu tarea. Esta fecha debe permanecer constante sin importar en qué zona horaria se encuentre.
Ejemplo. Desea llamar a su amigo a las 8 am el 25 de junio.
Crea esta tarea 5 días antes (20 de junio) mientras estás en China.
Luego, el mismo día, vuelas a Nueva York por unos días.
Luego, el 25 de junio, mientras todavía está en Nueva York, se despierta a las 7:30 a.m. (lo que significa que debe recibir una notificación de la tarea en 30 minutos (aunque sea la 1:30 p.m., ya en China, donde estaba cuando creó el tarea)
Entonces la tarea es ignorar la zona horaria. Significa 'Quiero hacerlo a las 8 a.m. en cualquier zona horaria en la que esté'.
Lo que hago es decir 'supongo que siempre estás en la zona horaria de Londres - UTC'.
Lo que significa es que, cuando el usuario elige alguna fecha en su zona horaria, convierto esta fecha en la misma fecha en UTC. es decir. Eliges las 8 am en China, pero lo convierto a las 8 am en UTC.
Luego, la próxima vez que abra la aplicación, leo la fecha guardada en UTC y la convierto a la misma fecha en su zona horaria actual, por ejemplo. Convierto las 8 am en UTC a las 8 am en la zona horaria de Nueva York.
Esta solución significa que la fecha puede significar algo más dependiendo de dónde se encuentre al configurarla y dónde la esté leyendo, pero permanece constante de una manera que 'se siente' como si siempre estuviera en la misma zona horaria.
Escribamos un código:
Primero, tenemos 2 funciones principales para convertir de / a UTC ignorando la zona horaria:
Luego, guardo / leo esta fecha como:
fuente
Acabo de descubrir que la versión 1.2.3 de date.format.js de Steven Levithan hace exactamente lo que quiero. Le permite proporcionar una cadena de formato para una fecha de JavaScript y se convertirá desde la hora local a UTC. Aquí está el código que estoy usando ahora:
fuente
He encontrado que el análisis de fechas de jQuery Globalization Plugin funciona mejor. Otros métodos tenían problemas de navegador cruzado y cosas como date.js no se habían actualizado en mucho tiempo.
Tampoco necesita un selector de fecha en la página. Simplemente puede llamar a algo similar al ejemplo dado en los documentos:
fuente
Esta función funciona muy bien para mí.
fuente
Usando el método moment.js UTC ;
fuente
Esto le dará la fecha y hora UTC adecuadas.
Es porque
getTimezoneOffset()
le dará la diferencia de zona horaria en minutos. Te recomiendo que no usestoISOString()
porque la salida estará en la cadena. Por lo tanto, en el futuro no podrás manipular la fechafuente
Esto es lo que he hecho en el pasado:
fuente
Si necesita Fecha Objeto
Al pasar solo la cadena de fecha, la fecha asume que la hora se 00:00 desplazada por zona horaria:
Si agrega las horas y minutos actuales, obtiene la fecha adecuada:
fuente
Al analizar su pregunta, está claro que solo desea enviar el rango de fechas a su back-end para su posterior procesamiento posterior.
Supongo que cumple con las pautas de datos estándar que esperan que los datos estén en un formato particular. Por ejemplo, uso ODATA, que es una API RESTfull que espera que los objetos de fecha y hora tengan el formato:
Eso se puede lograr fácilmente a través del fragmento publicado a continuación (cambie el formato según sus requisitos).
var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
Si, por otro lado, se encuentra en mi situación en la que recibió una fecha de su servidor y el navegador la convierte a su fecha local. Por otro lado, usted está interesado en la fecha UTC, luego puede realizar lo siguiente:
var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);
El fragmento de código anterior básicamente agrega / resta el tiempo agregado / restado por el navegador en función de la zona horaria.
Por ejemplo, si estoy en EST (GMT-5) y mi servicio devuelve un objeto de fecha y hora = mié 17 de agosto de 2016 00:00:00 GMT-0500, mi navegador resta automáticamente el desplazamiento de la zona horaria (5 horas) para obtener mi hora local. Entonces, si trato de recuperar el tiempo, recibo el miércoles 16 de agosto de 2016 19:00:00 GMT-0500. Esto causa muchos problemas. Hay muchas bibliotecas que definitivamente lo harán más fácil, pero quería compartir el enfoque JS puro.
Para obtener más información, consulte: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ donde obtuve mi inspiración.
¡Espero que esto ayude!
fuente
Este método le dará:
2017-08-04T11:15:00.000+04:30
y puede ignorar la variable de zona para obtener simplemente2017-08-04T11:15:00.000
.fuente
Con el paquete de momento, puede convertir fácilmente una cadena de fecha de UTC en un nuevo objeto Fecha:
Esto ayuda especialmente cuando su servidor no admite la zona horaria y desea almacenar la fecha UTC siempre en el servidor y recuperarla como un nuevo objeto Date. El código anterior funcionó para mi requisito de problema similar para el que es este hilo. Compartir aquí para que pueda ayudar a otros. No veo exactamente la solución anterior en ninguna respuesta. Gracias.
fuente
evento const = nueva fecha ();
console.log (event.toUTCString ());
fuente
Sé que esta pregunta es antigua, pero estaba viendo este mismo problema, y una opción sería enviar date.valueOf () al servidor en su lugar. La función valueOf () de la fecha javascript envía el número de milisegundos desde la medianoche del 1 de enero de 1970 UTC.
valor de()
fuente
Así que esta era la forma en que tenía que hacerlo porque todavía quería un objeto de fecha JavaScript para manipular como fecha y desafortunadamente muchas de estas respuestas requieren que vaya a una cadena.
fuente
hilo agregar momento
fuente
Aún más simple
fuente
setTime
se basa ennew Date
lo que no incluye. Por favor complete la respuesta.