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())

11 ответов

Решение

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

С http://momentjs.com/docs/

moment().toDate();

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

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

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

Вы правильно конвертируете момент в часовой пояс, который отражен во второй строке вывода 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,

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

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

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

Так как 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 с конвертированным временем

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

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) с аргументом 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 учитывает указанный вами часовой пояс и сравнивает ваше местное время со временем по Гринвичу, чтобы дать вам результат. Надеюсь, это было полезно.

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

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

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

Попробуй (без 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>

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

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

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

Момент обновил 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.

новая дата (момент ()) - могла выдать ошибку при экспорте столбца данных в Excel

использовать

moment.toDate() - не выдает ошибку и не портит экспортированный файл

Другие вопросы по тегам