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

Ответ 2

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

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

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

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

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

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

Несколько других мелочей:

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

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

Ответ 3

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

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

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

Ответ 4

Так как momentjs не контролирует объект даты в JavaScript, я нашел способ обойти это.

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Момент ([2012,11,24]). Клон(). Todate()

Любая переменная момента должна работать, пока вы используете .clone() перед .toDate().

Ответ 9

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

Ответ 10

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

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()