Converter data para UTC usando moment.js

95

Provavelmente e uma resposta fácil para isso, mas não consigo encontrar uma maneira de fazer com que o moment.js retorne uma data e hora UTC em milissegundos. Aqui está o que estou fazendo:

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

Alguma ideia do que estou fazendo de errado?

user1956816
fonte

Respostas:

101

Isso é encontrado na documentação . Com um momento parecido com uma biblioteca, recomendo que você leia toda a documentação. É muito importante.

Supondo que o texto de entrada seja inserido em termos do horário local dos usuários:

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

Se o usuário for instruído a inserir uma data / hora UTC, então:

 var expires = moment.utc(date).valueOf();
Matt Johnson-Pint
fonte
22
Editado - removido "facilmente". :)
Matt Johnson-Pint
6
E se eu já tiver um momento data-hora com fuso horário, como posso convertê-lo para UTC?
ア レ ッ ク ス
@Alexander -.utc()
Matt Johnson-Pint
2
Isso não funciona. Isso apenas muda os métodos usados ​​na data, não a data em si.
Colleen de
2
@Colleen - sim, mas normalmente alguém chamaria um desses métodos, como .format(), que emitiria o valor UTC. Ele não pode alterar o valor de data interno em si, porque um Datejá está rastreando um carimbo de data / hora UTC. São sempre apenas os métodos chamados que determinam se deve ser emitido UTC ou hora local. O momento é o mesmo nesse aspecto.
Matt Johnson-Pint de
53

Eu uso esse método e funciona. ValueOf não funciona para mim.

moment.utc(yourDate).format()
Bruno Quaresma
fonte
2
Isso funciona de acordo com a documentação. converte a hora local em UTC.
Kishor Pawar
1
Há algo suspeito aqui. Estou usando o moment.js ver. 2.17.1 e se 'sua data' for '2017-10-14T21: 00: 00Z' (en-us), o snippet acima retorna exatamente o mesmo resultado '2017-10-14T21: 00: 00Z' que obviamente não é utc já que estou em GMT + 3. O resultado correto seria '2017-10-15T00: 00: 00 + 03: 00' e você obterá isso por meio de 'moment (yourDate) .format ()'.
XDS de
14

A partir de: moment.js version 2.24.0

Vamos dizer que você tem uma entrada de data local, esta é a maneira correta de converter o seu dateTime ou Tempo de entrada para UTC :

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

ou no caso de você especificar uma data

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

Como você pode ver, a saída do resultado será retornada em UTC:

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

Mas se você fizer isso conforme abaixo, ele não será convertido para UTC:

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

Você está apenas configurando sua entrada para a hora utc, é como se mencionasse que myTime está em UTC .... a saída será 9:00

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

é o caminho a percorrer, uma vez que

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

se comporta estranho ...

Florian S
fonte
1
Você poderia, por favor, elaborar o comportamento estranho de moment().utc(date).format(...)?
Freeman Lambda
2
O comportamento não é estranho, são métodos diferentes. O primeiro moment.utc(date)é para analisar o date. O segundo moment().utc(date)é para manipular a hora atual ( moment()) e o dateparâmetro é inútil, pois .utc()neste caso não espera nenhum parâmetro.
CodingHamster
2

Isso funcionou para mim. Outros podem achar útil.

// date = 2020-08-31T00: 00: 00Z Estou na Dinamarca (o fuso horário é +2 horas)

moment.utc (moment (date) .utc ()). format () // retorna 2020-08-30T22: 00: 00Z

Mikael
fonte
1

Se tudo mais falhar, apenas reinicialize com o inverso de seu deslocamento 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
fonte
Isso não funciona. O que faz o trabalho é definir o keepOffsetparâmetro para true, como em moment(timestamp).toISOString(true),
Chris Haines
1

aqui, estou passando o objeto de data e convertendo-o na 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);
Invencível
fonte
1

Esta será a resposta:

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
fonte
0

Leia esta documentação do moment.js aqui . Veja abaixo o exemplo e a saída onde eu converto a hora GMT para a hora local (minha zona é IST) e, em seguida, converto a hora local para 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)

A saída é

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
fonte
-1

Você não precisa de algo para comparar e, em seguida, recuperar os milissegundos?

Por exemplo:

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

Com isso você tem o prazo de validade em UTC. Agora você pode obter a data "agora" em UTC e 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
fonte
O moment.valueOf()e (new Date()).getTime()ambos retornam os milissegundos desde 1º de janeiro de 1970 UTC (é um padrão)
Drenai