Moment.js преобразовать объект в дату

Используя Moment.js, я не могу преобразовать объект правильного момента в объект даты с часовыми поясами. Я не могу определить правильную дату.

Пример:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())

person vadim.zhiltsov    schedule 01.08.2013    source источник
comment
Какой результат вы ожидаете и какой результат вы получите?   -  person Felix Kling    schedule 01.08.2013
comment
4 строка, так что вывод: ‹code› (объект даты) Время со смещением Thu Aug 01 2013 15:23:49 GMT + 0300 (Финляндия (лето)) ‹/code› Но часовой пояс должен быть MST7MDT   -  person vadim.zhiltsov    schedule 01.08.2013
comment
Wednesday 24th 2019, 12:47:48 am можно ли это преобразовать в 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov   -  person Anupam Maurya    schedule 24.04.2019
comment
У объектов Date нет часового пояса, это просто смещение от 1970-01-01T00: 00: 00Z. Поэтому, когда вы вызываете toDate, возвращаемый объект теряет информацию о часовом поясе, которую вы прикрепили к объекту момента с помощью .tz("MST7MDT"). Вот почему существуют библиотеки, такие как moment.tz, чтобы дополнить базовые возможности встроенного объекта Date, который понимает только UTC и часовой пояс хоста, вот и все.   -  person RobG    schedule 16.02.2020


Ответы (10)


Используйте это, чтобы преобразовать объект момента в объект даты:

Из http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Урожайность:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
person Chandrew    schedule 04.11.2014
comment
@Spencer - Да, это отвечает заголовку, и toDate действительно, как получить объект Date из moment. Но код в теле вопроса спрашивает о преобразовании часовых поясов, чего Date сделать нельзя. Если время в горах действительно не является часовым поясом пользователя, я не уверен, как это ответило на вопрос. - person Matt Johnson-Pint; 12.02.2015
comment
@Matt, это просто зависит от того, на какую часть вопроса вы смотрите. Большинство людей ищут в Google и видят, что этот заголовок совпадает с их вопросом, и голосуют за ответ, который отвечает на заголовок, а не на текст вопроса. Это может объяснить, почему у него больше всего голосов, хотя это технически не помогает OP. - person Spencer; 13.07.2015
comment
Это действительно правильный ответ? Вопрос заключался в том, как преобразовать объект момента в дату javascript, но с TIMEZONE. Он по-прежнему возвращается к местному часовому поясу при изменении объекта даты javascript. - person Unspeakable; 07.07.2016
comment
@gtzinos то, на что вы ссылаетесь и на что ссылаетесь, является отдельной проблемой и сценарием, например, передача строки в конструктор момента moment("12/12/2011") - это то место, где вы получите это сообщение. Это не имеет никакого отношения к текущему моменту obj moment().toDate() - person btbJosh; 16.11.2016
comment
Насколько мне известно, метод toDate просто извлекает объект даты из объекта момента. если вы манипулируете датой момента, вы не получите этот результат в объекте даты с помощью этого метода. рассмотрим момент (). tz ('PST'). toDate не дает правильного значения - person qwerty_igor; 04.01.2018
comment
Это неправильный ответ. Вопрос конкретно касается timezone. ToDate () изменит часовой пояс исходного объекта момента и сопоставляет его с часовым поясом машины. Это означает, что исходная дата / время всегда будет изменяться и отображаться в собственном часовом поясе пользователя, что сейчас создает головную боль для всех пользователей. - person saran3h; 13.11.2018

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

Вы правильно конвертируете момент в часовой пояс, который отражается во второй строке вывода из momentObj.format().

При переключении на UTC не просто сбрасывается смещение, он возвращается к часовому поясу UTC. Если вы собираетесь это сделать, вам вообще не нужен исходный вызов .tz(). Вы могли бы просто сделать moment.utc().

Возможно, вы просто пытаетесь изменить строку формата вывода? Если это так, просто укажите параметры, которые вы хотите использовать для format метода:

momentObj.format("YYYY-MM-DD HH:mm:ss")

Что касается последних строк вашего кода - когда вы возвращаетесь к объекту Date с помощью toDate(), вы отказываетесь от поведения moment.js и возвращаетесь к поведению JavaScript. Объект JavaScript Date всегда будет печататься в местном часовом поясе компьютера, на котором он работает. С этим момент.js ничего не может поделать.

Еще пара мелочей:

  • Хотя конструктор момента может принимать Date, обычно лучше его не использовать. Для «сейчас» не используйте moment(new Date()). Вместо этого просто используйте moment(). Оба будут работать, но излишне избыточны. Если вы выполняете синтаксический анализ строки, передайте эту строку непосредственно в момент. Не пытайтесь сначала разобрать его на Date. Вы обнаружите, что синтаксический анализатор моментов намного более надежен.

  • Часовые пояса, подобные MST7MDT, используются по причинам обратной совместимости. Они происходят из часовых поясов в стиле POSIX, и лишь некоторые из них находятся в данных TZDB. Если в этом нет крайней необходимости, вы должны использовать такой ключ, как America/Denver.

person Matt Johnson-Pint    schedule 01.08.2013
comment
Спасибо, Мэтт! Ваш ответ был полезен. Как вы упомянули об использовании Америки / Денвера вместо MST7MDT, есть ли карта для этих сопоставлений? Я использую довольно много таких часовых поясов, как CET, EET, EST5EDT, CST6CDT, PST8PDT. - person monish001; 11.09.2014
comment
можно ли преобразовать, например: 10:20 AM (полученное строковое время из moment (). format ('hh: mm A')) в объект Date ?? - person ram; 06.11.2014
comment
@ram - 1) если у вас есть момент, просто используйте .toDate(). 2) Не используйте комментарии, чтобы задавать новые вопросы. Для этого предназначена большая кнопка Задать вопрос. - person Matt Johnson-Pint; 06.11.2014
comment
это то, что мне нужно, чтобы использовать дату. Мне также нужно было изменить часовой пояс, спасибо - person Rayner Fernández; 13.11.2020

.toDate на самом деле не сработал для меня. Итак, вот что я сделал:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

надеюсь это поможет

person Mawaheb    schedule 13.03.2015
comment
Этот ответ не отвечает на вопрос. Код - это длинный способ написания moment().add(1, 'd').toDate(). - person RobG; 16.02.2020

Поскольку momentjs не контролирует объект даты javascript, я нашел способ обойти это.

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

Это даст вам объект даты javascript с преобразованным временем

person Yasith Prabuddhaka    schedule 26.09.2018
comment
Это единственный правильный ответ, прямо отвечающий на вопрос. - person Anish Sana; 27.11.2018
comment
Это именно то, что я хотел. Я ожидал, что родные даты будут правильно отображать часовые пояса, но, к сожалению, ошиблись. - person mklbtz; 19.12.2018
comment
Формат ГГГГ-ММ-ДД ЧЧ: мм: сс не поддерживается Safari, поэтому результатом будет null. Формат должен быть ГГГГ-ММ-ДДТЧЧ: мм: сс (используйте формат, поддерживаемый ECMAScript, букву T между датой и временем). - person RobG; 16.02.2020

Вопрос немного невнятный. Я постараюсь объяснить это. Сначала вы должны понять, как использовать момент-часовой пояс. Согласно этому ответу здесь TypeError: moment (). Tz не является функцией, вам нужно импортировать момент из момент-часовой пояс вместо момента по умолчанию (конечно, вам сначала нужно будет установить момент-часовой пояс через npm!). Для ясности,

const moment=require('moment-timezone')//import from moment-timezone

Теперь, чтобы использовать функцию часового пояса, используйте moment.tz ("date_string / moment ()", "time_zone") (посетите https://momentjs.com/timezone/ для получения дополнительной информации). Эта функция вернет объект момента с определенным часовым поясом. Для ясности,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

Теперь, когда вы пытаетесь преобразовать newYork (объект момента) с помощью toDate () момента (преобразование формата ISO 8601), вы получите время по Гринвичу, Великобритания. Дополнительные сведения см. В этой статье https://www.nhc.noaa.gov/aboututc.shtml, о UTC. Однако, если вам просто нужно ваше местное время в этом формате (время Нью-Йорка, в соответствии с этим примером), просто добавьте метод .utc (true) с arg true , к вашему моменту объект. Для ясности,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

Короче говоря, moment.tz учитывает указанный вами часовой пояс и сравнивает ваше местное время со временем по Гринвичу, чтобы дать вам результат. Надеюсь, это было полезно.

person Vijay Joshua Nadar    schedule 06.11.2019

let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

красиво и чисто !!!!

person Emerson Bottero    schedule 17.02.2019
comment
В моем случае это было единственное решение, в котором использовался формат utc. Спасибо - person Luis Febro; 12.01.2020

Мне нужно было указать информацию о часовом поясе в строке даты. Первоначально я использовал moment.tz(dateStr, 'America/New_York').toString();, но затем у меня начались ошибки при передаче этой строки обратно в момент.

Я попробовал moment.tz(dateStr, 'America/New_York').toDate();, но потом потерял нужную мне информацию о часовом поясе.

Единственное решение, которое вернуло пригодную для использования строку даты с часовым поясом, которую можно было передать обратно в момент, было moment.tz(dateStr, 'America/New_York').format();

person chovy    schedule 19.03.2016

Чтобы преобразовать любую дату, например utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()
person kizoso    schedule 18.10.2019
comment
Это действительно спасло мне день! - person HV Sharma; 16.12.2019
comment
Это неверный ответ. Он применяет смещение часового пояса дважды: moment().utc() возвращает значения для UTC, затем .format( "YYYY-MM-DD HH:mm:ss" ) возвращает строку, которая была установлена ​​на UTC без смещения часового пояса, поэтому анализируется как локальная. Он не соответствует формату момента по умолчанию, поэтому анализируется встроенным анализатором. Он также не соответствует ни одному поддерживаемому формату ECMAScript, поэтому синтаксический анализ зависит от реализации. В любом случае он анализируется как локальный, поэтому смещение часового пояса применяется снова при создании значения времени даты. - person RobG; 16.02.2020

попробовать (без format шага)

new Date(moment())

var d = moment.tz("2019-04-15 12:00", "America/New_York");

console.log( new Date(d) );
console.log( new Date(moment()) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.min.js"></script>

person Kamil Kiełczewski    schedule 16.04.2019
comment
new Date(moment()) эквивалентно new Date(). Часовой пояс установлен только на d. - person RobG; 16.02.2020

moment обновил js lib по состоянию на 06/2018.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

если у вас есть свобода использовать Angular5 +, тогда лучше используйте функцию datePipe там, чем функцию часового пояса здесь. Мне нужно использовать moment.js, потому что мой проект ограничивается только Angular2.

person Feng Zhang    schedule 13.06.2018