Перетворення Moment.js на об'єкт дати


696

Використовуючи 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())

1
Який вихід ви очікуєте і який ви отримаєте?
Фелікс Клінг

4
4 рядок отримайте мене таким чином: <code> (об’єкт дати) Час зі зміщенням Чем 01 серпня 15 15:49 GMT + 0300 (Фінляндія (літо)) </code> Але часовий пояс повинен бути MST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amце можливо перетворити на 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

Об'єкти дат не мають часового поясу, вони є лише зрушенням з 1970-01-01T00: 00: 00Z. Тож, коли ви зателефонували доDate , повернутий об’єкт втратив інформацію про часовий пояс, яку ви приєднали до об'єкта моменту .tz("MST7MDT"). Ось чому існують такі бібліотеки, як moment.tz, щоб доповнити можливість голих кісток вбудованого об'єкта Date, який розуміє тільки UTC та часовий пояс хоста, ось і все.
RobG

Відповіді:


1236

Використовуйте це для перетворення об'єкта моменту в об’єкт дати:

Від http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Врожайність:

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

11
@Spencer - Так, він відповідає заголовку, і toDateсправді, як отримати Dateоб’єкт від а moment. Але код в тілі питання задає перетворення часового поясу - що Dateне може зробити. Якщо гірський час дійсно не є часовим поясом користувача, я не впевнений, як це відповіло на питання.
Метт Джонсон-Пінт

1
@Matt це просто залежить від того, яку частину питання ви дивитесь. Більшість людей шукає google і бачить, що цей заголовок узгоджується зі своїм запитанням та отримує відповідь, яка відповідає заголовку, а не тілу питання. Це може пояснити, чому це найбільше результатів, навіть якщо це технічно не допомагає ОП.
Спенсер

14
Це насправді правильна відповідь? Питання полягало у тому, як перетворити об’єкт моменту на дату javascript, але за допомогою TIMEZONE. Він все одно повертається до локального часового поясу при зміні об'єкта дати JavaScript.
Невимовно

1
Ей, хлопці, перевірте це посилання momentjs.com/guides/#/warnings/js-date . Це не рекомендується та буде видалено в майбутньому великому випуску.
gtzinos

3
@gtzinos, на що ви посилаєтесь і посилаєтесь, - це окрема проблема та сценарій, наприклад, передача рядка в конструктор моменту moment("12/12/2011")- це те, де ви отримаєте це повідомлення. Це не має нічого спільного з moment().toDate()
переходом

51

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

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

Перехід на UTC не просто зменшує зміщення, воно повертається до часового поясу UTC. Якщо ви збираєтеся це робити, то вам взагалі не потрібен оригінальний .tz()дзвінок. Ви могли просто зробити moment.utc().

Можливо, ви просто намагаєтесь змінити рядок вихідного формату? Якщо так, просто вкажіть параметри, які ви хочете для formatметоду:

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

Щодо останніх рядків вашого коду - коли ви повертаєтесь до Dateоб’єкта, використовуючи toDate(), ви відмовляєтесь від поведінки moment.js і повертаєтесь до поведінки JavaScript. JavaScriptDateОб'єкт завжди буде надрукований у локальному часовому поясі комп'ютера, на якому він працює. Нічого moment.js не може з цим зробити.

Кілька інших дрібниць:

  • Хоча конструктор моменту може зайняти Date, зазвичай, краще не використовувати його. Для "зараз" не використовуйте moment(new Date()). Замість цього просто використовуйте moment(). Обидва будуть працювати, але це зайве. Якщо ви аналізуєте рядок, передайте цей рядок прямо в момент. Не намагайтеся розібрати його Dateспочатку. Ви знайдете аналізатор моменту набагато надійнішим.

  • Часові зони, як-от MST7MDT, існують із причин зворотної сумісності. Вони походять із часових поясів у стилі POSIX, і лише деякі з них містяться в даних TZDB. Якщо це абсолютно не потрібно, вам слід використовувати такий ключ, як America/Denver.


Дякую Метт! Ваша відповідь була корисною. Як ви вже згадували про використання Америки / Денвера замість MST7MDT, чи доступна карта для цих відображень? Я використовую досить багато таких часових поясів, як CET, EET, EST5EDT, CST6CDT, PST8PDT.
monish001

чи можливо перетворити, наприклад: "10:20 AM" (Отриманий рядковий час від моменту (). формат ('hh: mm A')) до об'єкта Date ??
ram

2
@ram - 1) якщо у вас є момент, просто використовуйте .toDate(). 2) Не використовуйте коментарі, щоб задавати нові запитання. Ось для чого велика кнопка "Задати питання" .
Метт Джонсон-Пінт

22

.toDate не дуже працював для мене, Отже, ось що я зробив:

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

сподіваюся, що це допомагає


2
Ця відповідь не відповідає на запитання. Код - це тривалий спосіб написання moment().add(1, 'd').toDate().
RobG

12

Оскільки 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 з перетвореним часом


2
Це єдина правильна відповідь, яка безпосередньо відповідає на питання.
Аніш Сана

1
Це саме те, що я хотів. Я очікував, що рідні Дати правильно представлять часові пояси, але я, на жаль, помилився.
mklbtz

1
Формат "YYYY-MM-DD HH: mm: ss" Safari не підтримується, тому результат є нульовим . Формат повинен бути "YYYY-MM-DDTHH: mm: ss" (використовуйте підтримуваний ECMAScript формат, "T" між частинами дати та часу).
RobG

4

Мені потрібно було мати інформацію про часовий пояс у своєму рядку дати. Спочатку я використовував, moment.tz(dateStr, 'America/New_York').toString();але потім я почав отримувати помилки щодо введення цієї струни в момент.

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

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



3

Щоб конвертувати будь-яку дату, наприклад utc:

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

2
Це справді врятувало мені день!
HV Sharma

Ця відповідь неправильна. Він застосовує зміщення часового поясу двічі: moment().utc()повертає значення для UTC, потім .format( "YYYY-MM-DD HH:mm:ss" )повертає рядок, який був встановлений на UTC без зміщення часового поясу, так що аналізується як локальний. Він не відповідає формату моменту за замовчуванням, тому аналізується вбудованим аналізатором. Він не відповідає жодному підтримуваному формату ECMAScript, тому аналіз залежить від реалізації. У будь-якому випадку він аналізується як локальний, тому зміщення часового поясу застосовується знову при створенні значення часу Дати.
RobG

3

Питання трохи незрозуміле. Я зроблю все можливе, щоб це пояснити. Спочатку слід зрозуміти, як використовувати момент-часовий пояс . Відповідно до цієї відповіді, тут 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) з аргументом 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 враховує вказаний вами часовий пояс і порівнює місцевий час із часом у Грінвічі, щоб отримати результат. Сподіваюся, це було корисно.


2

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


1

спробуйте (без formatкроку)

new Date(moment())


new Date(moment())еквівалентно new Date(). Часовий пояс встановлюється лише для d .
RobG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.