Convierta la fecha a UTC usando moment.js

95

Probablemente y una respuesta fácil a esto, pero parece que no puedo encontrar una manera de obtener moment.js para devolver una fecha UTC en milisegundos. Esto es lo que estoy haciendo:

var date = $("#txt-date").val(),
    expires = moment.utc(date);

¿Alguna idea de lo que estoy haciendo mal?

usuario1956816
fuente

Respuestas:

101

Esto se encuentra en la documentación . Con un momento de biblioteca, le insto a que lea la documentación completa. Es muy importante.

Suponiendo que el texto de entrada se ingrese en términos de la hora local de los usuarios:

 var expires = moment(date).valueOf();

Si se le indica al usuario que ingrese una fecha / hora UTC, entonces:

 var expires = moment.utc(date).valueOf();
Matt Johnson-Pinta
fuente
22
Editado: eliminado "fácilmente". :)
Matt Johnson-Pint
6
Y si ya tengo una fecha y hora de momento con una zona horaria, ¿cómo puedo convertirla a UTC?
ア レ ッ ク ス
@Alexander -.utc()
Matt Johnson-Pint
2
Eso no funciona. Eso solo cambia los métodos utilizados en la fecha, no la fecha en sí.
Colleen
2
@Colleen: sí, pero normalmente se llamaría a uno de esos métodos, como .format(), que emitiría el valor UTC. No puede cambiar el valor de la fecha interna en sí, porque a Dateya está rastreando una marca de tiempo UTC. Siempre son solo los métodos llamados los que determinan si emitir UTC o la hora local. El momento es el mismo en ese sentido.
Matt Johnson-Pint
53

Utilizo este método y funciona. ValueOf no me funciona.

moment.utc(yourDate).format()
Bruno Quaresma
fuente
2
Esto funciona según la documentación. convierte la hora local a UTC.
Kishor Pawar
1
Hay algo raro aquí. Estoy usando moment.js ver. 2.17.1 y si 'yourdate' es '2017-10-14T21: 00: 00Z' (en-us), el fragmento anterior devuelve exactamente el mismo resultado '2017-10-14T21: 00: 00Z' que obviamente no es utc ya que estoy en gmt + 3. El resultado correcto sería '2017-10-15T00: 00: 00 + 03: 00' y lo obtiene a través de 'moment (yourDate) .format ()'.
XDS
14

A partir de: moment.js version 2.24.0

digamos que tiene una entrada de fecha local, esta es la forma correcta de convertir su entrada dateTime o Time a UTC :

var utcStart = new moment("09:00", "HH:mm").utc();

o en caso de que especifique una fecha

var utcStart = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();

Como puede ver, la salida del resultado se devolverá en UTC:

//You can call the format() that will return your UTC date in a string 
 utcStart.format(); 
//Result : 2019-06-24T13:00:00 

Pero si hace esto como se muestra a continuación, no se convertirá a UTC:

var myTime = new moment.utc("09:00", "HH:mm"); 

Solo está configurando su entrada a la hora utc, es como si estuviera mencionando que myTime está en UTC, ... la salida será a las 9:00

napi15
fuente
3
moment.utc(date).format(...); 

es el camino a seguir, ya que

moment().utc(date).format(...);

se comporta raro ...

Florian S
fuente
1
¿Podría explicarnos el extraño comportamiento de moment().utc(date).format(...)?
Freeman Lambda
2
El comportamiento no es extraño, esos son métodos diferentes. El primero moment.utc(date)es para analizar el date. El segundo moment().utc(date)es para manipular la hora actual ( moment()) y el dateparámetro es inútil ya que este .utc()en este caso no espera ningún parámetro.
CodingHamster
2

Esto funcionó para mí. Otros pueden encontrarlo útil.

// date = 2020-08-31T00: 00: 00Z Estoy ubicado en Dinamarca (la zona horaria es +2 horas)

moment.utc (momento (fecha) .utc ()). format () // devuelve 2020-08-30T22: 00: 00Z

Mikael
fuente
1

Si todo lo demás falla, simplemente reinicialice con un inverso de su desplazamiento local.

var timestamp = new Date();
var inverseOffset = moment(timestamp).utcOffset() * -1;
timestamp = moment().utcOffset( inverseOffset  );

timestamp.toISOString(); // This should give you the accurate UTC equivalent.
Timothy perez
fuente
Esto no funciona. Lo que sí funciona es establecer el keepOffsetparámetro en verdadero, como en moment(timestamp).toISOString(true),
Chris Haines
1

aquí, paso el objeto de fecha y lo convierto en hora UTC.

$.fn.convertTimeToUTC = function (convertTime) {
   if($(this).isObject(convertTime)) {
        return moment.tz(convertTime.format("Y-MM-DD HH:mm:ss"), moment.tz.guess()).utc().format("Y-MM-DD HH:mm:ss");
    }
};
// Returns if a value is an object
$.fn.isObject =  function(value) {
    return value && typeof value === 'object';
};


//you can call it as below
$(this).convertTimeToUTC(date);
Invencible
fuente
1

Esta será la respuesta:

moment.utc(moment(localdate)).format()
localdate = '2020-01-01 12:00:00'

moment(localdate)
//Moment<2020-01-01T12:00:00+08:00>

moment.utc(moment(localdate)).format()
//2020-01-01T04:00:00Z
soohan
fuente
0

Lea esta documentación de moment.js aquí . Vea el ejemplo y la salida a continuación donde convierto la hora GMT a la hora local (mi zona es IST) y luego convierto la hora local a GMT.

// convert GMT to local time
console.log('Server time:' + data[i].locationServerTime)
let serv_utc = moment.utc(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment(serv_utc,"YYYY-MM-DD HH:mm:ss").tz(self.zone_name).format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to local time:' + data[i].locationServerTime)

// convert local time to GMT
console.log('local time:' + data[i].locationServerTime)
let serv_utc = moment(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment.utc(serv_utc,"YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to server time:' + data[i].locationServerTime)

La salida es

Server time:2019-12-19 09:28:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to local time:2019-12-19 14:58:13
local time:2019-12-19 14:58:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to server time:2019-12-19 09:28:13
dineshydv
fuente
-1

¿No necesitas algo para comparar y luego recuperar los milisegundos?

Por ejemplo:

let enteredDate = $("#txt-date").val(); // get the date entered in the input
let expires = moment.utc(enteredDate); // convert it into UTC

Con eso tienes la fecha de vencimiento en UTC. Ahora puede obtener la fecha "ahora mismo" en UTC y comparar:

var rightNowUTC = moment.utc(); // get this moment in UTC based on browser
let duration = moment.duration(rightNowUTC.diff(expires)); // get the diff
let remainingTimeInMls = duration.asMilliseconds();
theRonny
fuente
El moment.valueOf()y (new Date()).getTime()ambos devuelven los milisegundos desde el 1 de enero de 1970 UTC (es un estándar)
Drenai