Перетворити дату в UTC за допомогою moment.js


95

Можливо, і проста відповідь на це, але я, здається, не можу знайти спосіб отримати moment.js, щоб повернути час дати UTC у мілісекундах. Ось що я роблю:

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

Будь-яка ідея, що я роблю не так?

Відповіді:


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


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

Це спрацювало для мене. Інші можуть виявити це корисним.

// дата = 2020-08-31T00: 00: 00Z Я перебуваю в Данії (часовий пояс +2 години)

moment.utc (момент (дата) .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параметра як істина, як у 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

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.