MomentJS получает JavaScript Дата в UTC

Я не могу получить строку даты JavaScript для записи MongoDB следующим образом. Он продолжает использовать мое местное время.

var utc = moment.utc().valueOf();
console.log(moment.utc(utc).toDate());

Вывод:

Tue Nov 11 2014 14:42:51 GMT-0500 (EST)

Мне нужно, чтобы это было в UTC, поэтому я могу вставить эту метку времени в Mongo, поэтому тип будет Date.

Как я могу это сделать?

Ответы

Ответ 1

Отметка времени - это момент времени. Как правило, это может быть представлено через несколько миллисекунд после epoc (Unix Epoc от 1 января 1970 года в 12:00 UTC). Формат этого момента времени зависит от часового пояса. Хотя это один и тот же момент времени, "значение часов" не одинаково среди часовых поясов, и необходимо учитывать смещение от UTC.

Вот некоторый код для иллюстрации. Точка - это время, полученное тремя разными способами.

var moment = require( 'moment' );

var localDate = new Date();
var localMoment = moment();
var utcMoment = moment.utc();
var utcDate = new Date( utcMoment.format() );

//These are all the same
console.log( 'localData unix = ' + localDate.valueOf() );
console.log( 'localMoment unix = ' + localMoment.valueOf() );
console.log( 'utcMoment unix = ' + utcMoment.valueOf() );

//These formats are different
console.log( 'localDate = ' + localDate );
console.log( 'localMoment string = ' + localMoment.format() );
console.log( 'utcMoment string = ' + utcMoment.format() );
console.log( 'utcDate  = ' + utcDate );

//One to show conversion
console.log( 'localDate as UTC format = ' + moment.utc( localDate ).format() );
console.log( 'localDate as UTC unix = ' + moment.utc( localDate ).valueOf() );

Что выводит это:

localData unix = 1415806206570
localMoment unix = 1415806206570
utcMoment unix = 1415806206570
localDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localMoment string = 2014-11-12T10:30:06-05:00
utcMoment string = 2014-11-12T15:30:06+00:00
utcDate  = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localDate as UTC format = 2014-11-12T15:30:06+00:00
localDate as UTC unix = 1415806206570

В миллисекундах все одинаковы. Это точно такой же момент времени (хотя в некоторых случаях более поздняя миллисекунда на один выше).

Что касается формата, каждый может быть представлен в определенном часовом поясе. И форматирование строки этого часового пояса выглядит по-разному, в один и тот же момент времени!

Собираетесь ли вы сравнить эти значения времени? Просто конвертируйте в миллисекунды. Одно значение в миллисекундах всегда меньше, равно или больше, чем другое значение в миллисекундах.

Вы хотите сравнить конкретные значения "час" или "день" и беспокоиться, что они "пришли" из разных часовых поясов? Сначала преобразуйте в UTC с помощью moment.utc( existingDate ), а затем выполните операции. Примерами этих преобразований при выходе из БД являются последние вызовы console.log в этом примере.

Ответ 2

Вызов toDate создаст копию (документация неправильно написана неправильно о том, что она не является копией) основного объекта JS Date. Объект даты JS хранится в формате UTC и всегда будет печатать в восточном времени. Не вдаваясь в то, изменяет ли .utc() базовый объект, который обертывает этот момент, используя код ниже.

Вам не нужен момент для этого.

new Date().getTime()

Это работает, потому что JS Date по своему ядру находится в UTC от Unix Epoch. Это необычайно сбивает с толку, и я считаю большой недостаток в интерфейсе, чтобы смешивать локальные и UTC-времена, подобные этому, без описания методов.

Ответ 3

Или просто:

Date.now

Из документации MDN:

Метод Date.now() возвращает количество миллисекунд, прошедших с 1 января 1970 г.

Доступно с ECMAScript 5.1

Это то же самое, что было упомянуто выше (new Date().getTime()), но более new Date().getTime() версия.