Преобразование даты в UTC с помощью moment.js

95

Наверное, и простой ответ на это, но я не могу найти способ заставить момент.js возвращать дату в формате UTC в миллисекундах. Вот что я делаю:

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

Есть идеи, что я делаю неправильно?

user1956816
источник

Ответы:

101

Это можно найти в документации . В этот момент я призываю вас прочитать всю документацию. Это действительно важно.

Предполагая, что вводимый текст вводится по местному времени пользователя:

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

Если пользователю дано указание ввести дату / время в формате UTC, тогда:

 var expires = moment.utc(date).valueOf();
Мэтт Джонсон-Пинт
источник
22
Отредактировал - удалил «легко». :)
Мэтт Джонсон-Пинт
6
И если у меня уже есть моментная дата-время с часовым поясом, как я могу преобразовать его в UTC?
ア レ ッ ク ス
@Alexander -.utc()
Мэтт Джонсон-Пинт
2
Это не работает. Это изменяет только методы, используемые для даты, но не саму дату.
Коллин
2
@Colleen - да, но обычно затем вызывается один из этих методов, например .format(), который выдаст значение UTC. Он не может изменить само значение внутренней даты, потому что a Dateуже отслеживает метку времени в формате UTC. Всегда только вызываемые методы определяют, следует ли передавать время в формате UTC или местное время. Момент в этом отношении тот же.
Мэтт Джонсон-Пинт,
53

Я использую этот метод, и он работает. ValueOf у меня не работает.

moment.utc(yourDate).format()
Бруно Куарежма
источник
2
Это работает согласно документации. конвертирует местное время в UTC.
Кишор Павар
1
Здесь есть что-то подозрительное. Я использую moment.js ver. 2.17.1, и если «yourdate» соответствует «2017-10-14T21: 00: 00Z» (en-us), то приведенный выше фрагмент возвращает точно такой же результат «2017-10-14T21: 00: 00Z», который, очевидно, не utc, поскольку я в gmt + 3. Правильный результат будет '2017-10-15T00: 00: 00 + 03: 00', и вы получите его через 'moment (yourDate) .format ()'.
XDS
14

По состоянию на: moment.js version 2.24.0

скажем, у вас есть локальный ввод даты, это правильный способ преобразовать ваш ввод dateTime или Time в UTC :

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

или если вы укажете дату

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

Как видите, результат будет возвращен в формате UTC:

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

Но если вы сделаете это, как показано ниже, он не будет преобразован в UTC:

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

Вы только устанавливаете свой ввод на время utc, как если бы вы упоминали, что myTime находится в UTC, .... вывод будет 9:00

напи15
источник
3
moment.utc(date).format(...); 

это путь, так как

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

ведет себя странно ...

Флориан С
источник
1
Не могли бы вы рассказать о странном поведении moment().utc(date).format(...)?
Freeman Lambda
2
Поведение не странное, это разные методы. Первым moment.utc(date)для разбораdate . Второй moment().utc(date)- для управления текущим временем ( moment()), и dateпараметр бесполезен, поскольку .utc()в этом случае он не ожидает никаких параметров.
CodingHamster
2

Это сработало для меня. Другие могут счесть это полезным.

// date = 2020-08-31T00: 00: 00Z Я нахожусь в Дании (часовой пояс +2 часа)

moment.utc (moment (date) .utc ()). format () // возвращает 2020-08-30T22: 00: 00Z

Микаэль
источник
1

Если ничего не помогает, просто выполните повторную инициализацию с инверсией вашего локального смещения.

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

timestamp.toISOString(); // This should give you the accurate UTC equivalent.
Тимоти Перес
источник
Это не работает. Что действительно работает, так это установка для keepOffsetпараметра значения true, например moment(timestamp).toISOString(true),
Крис Хейнс,
1

здесь я передаю объект даты и конвертирую его во время в формате 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);
Непобедимый
источник
1

Это будет ответ:

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
сухан
источник
0

Прочтите эту документацию по moment.js здесь . См. Ниже пример и вывод, где я конвертирую время GMT в местное время (моя зона - IST), а затем конвертирую местное время в 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)

Выход

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
источник
-1

Разве вам не нужно что-то сравнивать, а затем получать миллисекунды?

Например:

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

При этом у вас есть дата истечения срока в UTC. Теперь вы можете получить дату «прямо сейчас» в формате UTC и сравнить:

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();
Ронни
источник
В moment.valueOf()и (new Date()).getTime()возвращают миллисекунды с 1 января 1970 года по UTC (это стандарт)
Drenai