¿Cómo se convierte una fecha de JavaScript a UTC?


590

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á?


10
Resucité esto porque fue el mejor éxito de Google para mí, y los navegadores más nuevos tienen soporte incorporado para cadenas de fecha UTC.
jcomeau_ictx

44
Actualicé la respuesta aceptada para resaltar el nuevo método ECMAscript 5 toISOString (). Ver stackoverflow.com/a/11957822/19112
dthrasher

55
¿así que en 2015 tengo que meterme con las fechas de encadenamiento y análisis? ¡ridículo!
Kit de herramientas

2
Por supuesto que si. Nunca puede confiar en que otra persona haga el trabajo por usted :-P Al menos hasta que el mundo deje de usar zonas horarias y comience a unificar las fechas y horas.
Erenor Paz

44
"Stardates", preferiblemente.
Michael Daw

Respuestas:


370

El toISOString()método devuelve una cadena en formato ISO extendido simplificado ( ISO 8601 ), que siempre tiene 24 o 27 caracteres de longitud ( YYYY-MM-DDTHH:mm:ss.sssZo ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectivamente). La zona horaria siempre es cero desplazamiento UTC, como se indica con el sufijo " Z".

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:

var isoDate = new Date('yourdatehere').toISOString();

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.


81
en realidad, esto convierte el objeto de fecha en una cadena, no podrá realizar más operaciones de fecha en él
orszaczky

2
@TheRebel, el caso de uso dado es que necesita enviar al servidor una cadena formateada.
Will Stern

28
@Will, estás totalmente correcta, pero - al igual que la mayoría de los espectadores aquí asumo - llegué aquí basado en el título, en busca de la fecha general de JS para la conversión UTC, así que pensé que es útil mencionar aquí :)
orszaczky

44
¡Tenga cuidado al usar este método! No crea una fecha UTC: formatea los datos de fecha existentes tal cual en un formato UTC y le da una zona horaria "Z". ¡Esto está mal el 99% del tiempo! ¡Debe convertir la fecha a la zona horaria GMT antes de usar este método!
user1944491

55
@ user1944491 No creo que esto sea correcto. De acuerdo con los documentos de MDN, toISOStringse convierte correctamente a UTC. [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetTambién en el ejemplo muestran que el desplazamiento se tiene en cuenta cuando se llama toISOString
FFF

560

Simple y estupido

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
Me gustó tu idea e hice un método que he estado usando muchas veces. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
El código más corto que se me ocurrió para obtener la fecha y hora UTC es al cortar la zona horaria:new Date(new Date().toUTCString().substr(0, 25))
joelvh

17
Tenga en cuenta que getUTCMonth () devuelve valores de 0 a 11. Por lo tanto, si necesita el mes por número en lugar de una cadena, ayuda a +1 al valor.
Talvi Watia

19
Esto no tiene sentido. La nueva Fecha tendrá un valor diferente al que realmente desea. Solo use en now.toUTCSTring()lugar de (incorrecto) now_utc.toString().
Bergi

22
No usaría esto: al usar la nueva Fecha () obtienes la zona horaria del navegador. en Chrome 29 e IE10, la fecha y la hora parecen ser correctas, pero la zona horaria está configurada en la zona horaria del navegador, lo que podría causar problemas ...
Sean

207

Aquí está mi método:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

El utcobjeto 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.


Estaba analizando ese problema cuando me di cuenta de que 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 por 60 * 1000ser más claro :))
Timothée Boucher

18
¡Agregar el 60000 * Date.getTimezoneOffset () es incorrecto! Primero, debe pensar que todas las fechas / horas ya son UTC con un modificador de zona horaria para fines de visualización. Los navegadores pueden diferir, sin embargo, Date.getTime () devuelve el número de milisegundos desde 1970-01-01. Si crea una nueva Fecha con este número, por ejemplo: nueva Fecha (Date.getTime ()); que será UTC , sin embargo cuando se muestra que (por ejemplo: a través de la consola de herramientas de Chrome dev) se parece ser su zona horaria local.
Aaron Hoffman

15
En mi navegador, esto crea un DateTime que no es UTC. Sin embargo, cuando se muestra en mi navegador, 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.
Aaron Hoffman

Gotcha, punto interesante. Comparemos now.toString()con utc.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.
Gras Double

44
Esta respuesta demuestra otra implementación común del "cambio de época" que es peligroso de forma aislada, ya que puede fallar en casos extremos como las transiciones DST. No recomendado.
Matt Johnson-Pint

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Esto funciona bien Solo necesitaba reemplazar el "-" en mis fechas de origen a "/" para crear una fecha de JavaScript, luego podría llamar a su función toISO () para obtener la salida correcta.
dthrasher

Esto funciona muy bien. También puede alimentar el resultado en jQuery $ .parseDate (...) para recuperar un objeto de fecha que se ha cambiado a UTC.
Brian Ellis

23

Convierte a ISO sin cambiar la fecha / hora

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Convierte a ISO con un cambio en la fecha / hora (la fecha / hora cambiará)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Enlace de violín


Entonces, ¿esto es una especie de UTC falso? Cambio mi fecha local y logro enviar al servidor la fecha y hora que realmente veo en el reloj de mi PC. Guau. De todos modos, mejor que riguroso y analizador
Toolkit

Además, no necesita .toISOString (), solo puede enviar isoDate al servidor
Toolkit

.toISOString () es simple y directo, obtener la fecha será un paso adicional (isoDate no es una función).
RollerCosta

¿No necesita agregar el desplazamiento en lugar de restarlo? Consulte stackoverflow.com/a/11964609/832230
Acumenus

@ABB Si el desplazamiento de la zona horaria actual es + ve, entonces deberíamos restarlo (en nuestro caso IST es +5: 30) de lo contrario sumar.
RollerCosta

18

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/Date

  • Si no se proporcionan argumentos, el constructor crea un objeto Fecha de JavaScript para la fecha y hora actuales de acuerdo con la configuración del sistema.
  • Nota: Cuando se llama a Date como un constructor con más de un argumento, los argumentos especificados representan la hora local. Si se desea UTC, use la nueva Fecha ( Date.UTC (...) ) con los mismos argumentos. (nota: Date.UTC () devuelve el número de milisegundos desde 1970-01-01 00:00:00 UTC)

Agregar 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.


11
Acabo de ejecutar este código en Fx y Chrome, parece que no funciona: el resultado es exactamente el mismo que el de new Date(), ni la marca de tiempo ni la zona horaria cambian
Gras Double

3
Esto se debe a que las marcas de tiempo no tienen zona horaria. new 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.
frontendbeauty

77
Por lo que puedo decir, new Date(new Date().getTime())devuelve exactamente el mismo valor que new Date(). ¿Puede explicar en qué sentido su respuesta proporciona un valor distinto new Date()?
Kirk Woll

Estoy publicando este valor en mi servidor 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 epoch new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). El resultado es 5/19/2014 7:00:00 AM. Entonces parece que getTime () da la cantidad de milisegundos, incluido mi desplazamiento UTC.
xr280xr

1
Hay muchos comentarios quejándose de que new Date(new Date().getTime())no funciona. Puedo confirmar que new Date(Date.UTC(2019, 8, 27, 0, 0, 0))efectivamente produce tiempo UTC. Si no lo usa Date.UTC(...), obtendrá fechas en UTC compensadas en su zona horaria.
Alex Barker

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
El objeto de fecha debe establecerse realmente en una fecha. Lo anterior es solo un ejemplo.
James Skidmore

55
Ahora devuelve "Jue, 04 de junio de 2009 04:10:56 GMT", que no es el formato ISO requerido en el OP.
nickf

44
Esto lo convierte en una cadena, que no es una cita
Anthony

2
no, en realidad debería ser una representación de cadena de una fecha de acuerdo con el OP.
jcomeau_ictx

3
Después de convertir a UTC, regresa en formato de cadena, luego cómo acceder a métodos como getMonth (), getDate () etc.
Sandeep sandy

10

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)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

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)


7

¿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.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

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.


1
Este es el primer ejemplo que he visto que intenta manejar el desplazamiento de la zona horaria, por lo que +1 para eso. Sin embargo, encontré un par de cosas: temp.substr (-2) causa un error porque es un número, no una cadena, por lo que debe hacer algo como "temp = '' + temp;" primero, convertirlo en una cuerda. Además, prefiero mis fechas ISO con relleno de cero, creo que esto las hace más estándar.
Mick Sear

@Mick - He actualizado para corregir ese error. Lo he usado String(temp)desde la otra manera ( "" + temp) se informa como un error JSLint en estos días.
nickf

Esto ahora está estandarizado como toISOStringmétodo
Bergi el

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

Debería funcionar en la mayoría de los navegadores más nuevos. vuelve 2012-07-28T00:00:00.000Zen Firefox 6.0


7

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:

new Date('date as text');

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é).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

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.


FYI getYear se está eliminando de los estándares web developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ghan

6

Si tiene muchas citas, vale la pena usar moment.js ( http://momentjs.com ). El método para convertir a UTC sería:

moment(yourTime).utc()

Puede usar el formato para cambiar su fecha a cualquier formato que desee:

moment(yourTime).utc().format("YYYY-MM-DD")

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:

moment.tz(yourUTCTime, "America/New_York")

¿Cuál es la diferencia entre moment(yourTime).utc()y moment.utc(yourTime)? Usualmente uso el último.
ps0604

5

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:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Luego, guardo / leo esta fecha como:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

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:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

99
Esta no parece ser la mejor respuesta para su pregunta. Debe reconsiderar algo que responda directamente a su pregunta o haga su pregunta de manera diferente.
hitautodestruct

1
Estoy arreglando este script exacto (y versión) porque es insuficiente para IE7 y Firefox.
Barbarrosa

4

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:

$.parseDate('yy-mm-dd', '2007-01-26');

1
El hecho de que algo no se haya actualizado no significa que no deba usarlo. Date.js ha funcionado perfectamente durante años, por lo que no ha sido necesario actualizarlo. El objeto de fecha JS y los formatos de fecha en uso no han cambiado en los últimos años, entonces, ¿por qué el guión que los manipula? Date.JS es absolutamente la mejor biblioteca de JS Date que existe. Hay algunos problemas en github, pero por lo demás, es perfecto. github.com/datejs/Datejs
thugsb

3

Esta función funciona muy bien para mí.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

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 uses toISOString()porque la salida estará en la cadena. Por lo tanto, en el futuro no podrás manipular la fecha


2

Esto es lo que he hecho en el pasado:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

2

Si necesita Fecha Objeto

Al pasar solo la cadena de fecha, la fecha asume que la hora se 00:00 desplazada por zona horaria:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Si agrega las horas y minutos actuales, obtiene la fecha adecuada:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

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:

AAAA-MM-DDT00: 00: 00.

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!


1

Este método le dará: 2017-08-04T11:15:00.000+04:30y puede ignorar la variable de zona para obtener simplemente 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

Con el paquete de momento, puede convertir fácilmente una cadena de fecha de UTC en un nuevo objeto Fecha:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

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.


44
Aunque esto puede responder la pregunta, no hay explicación de su código. Actualice su respuesta para proporcionar una explicación de lo que está haciendo. ¡Gracias!
Miroslav Glamuzina


0

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()


0

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.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

hilo agregar momento

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Aún más simple

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
Esto esta incompleto. setTimese basa en new Datelo que no incluye. Por favor complete la respuesta.
random_user_name

¿Este hombre sigue vivo? ¿por qué ni siquiera volver a nosotros, decir algo o editar la respuesta?
Desesperado
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.