Як я відформатую дату як ISO 8601 у moment.js?


201

Цей документ згадується moment.ISO_8601як варіант форматування (від 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), але жоден з цих не працює (навіть 2.7.0):

var date = moment();
date.format(moment.ISO_8601); // error
moment.format(date, moment.ISO_8601); // error

( http://jsfiddle.net/b3d6uy05/1/ )

Як я можу отримати ISO 8601 від moment.js?


Яку версію моменту ви використовуєте? Документи кажуть, що константа була додана в 2.7.0.
joews

@joews 2.7.0. Уточнено в питанні. Дивіться мою відповідь, я зрозумів це. Документи не дуже зрозумілі.
сеннетт

Так, вони лише згадують спеціальні формати в контексті розбору. Незвичайно.
Joews

2
Ви можете спробуватиmoment().toISOString()
Saahithyan Vigneswaran

Відповіді:


339
moment().toISOString(); // or format() - see below

http://momentjs.com/docs/#/displaying/as-iso-string/

Оновлення на основі відповіді: по @sennet і зауваженням @dvlsg (див скрипки ) слід зазначити , що існує різниця між formatі toISOString. Обидва є правильними, але основний процес відрізняється. toISOStringперетворюється на об'єкт Date, встановлює UTC, потім використовує натиснуту функцію прототипу Date для виведення ISO8601 в UTC за допомогою мілісекунд ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). З іншої сторони,format використовує формат за замовчуванням ( YYYY-MM-DDTHH:mm:ssZ) без мілісекунд і підтримує зміщення часового поясу.

Я відкрив проблему, оскільки, думаю, це може призвести до несподіваних результатів.


1
Я з вами згоден @Yashua. Я думаю, що слід уникати використання "format ()", оскільки це не інтуїтивно. Крім того, я не думаю, що функція, яка просто загортає нативну "toISOString ()", взагалі повинна існувати. Однак, можливо, буде надано нову функцію на зразок: "toISO8601 ()" з можливістю зберігати часовий пояс та належну документацію.
Грейвін Лопес

4
Якщо ви хочете час utc, але відформатований по-своєму, замість ISO8601, ви можете зробити наступне:moment().utc().format("OUTPUT_FORMAT")
StinkyCat

Корисно при формуванні дати в кібані, але ви не маєте доступу до JS.
Бріс

1
Якщо ви хочете підтримувати локальний часовий пояс, використовуйте moment().toISOString(true);.
Benny Neugebauer

83

Використовувати formatбез параметрів:

var date = moment();
date.format(); // "2014-09-08T08:02:17-05:00"

( http://jsfiddle.net/8gvhL1dz/ )


31
Ці дві відповіді, як побічна примітка, ці два відповіді не є однаковими, навіть якщо вони відповідають вимогам ISO-формату. date.toISOString()буде тримати мілісекунди і використовувати utc, скине date.format()мілісекунди і використовувати ваш локальний часовий пояс (або, принаймні, така поведінка, яку я зараз отримую в хромі - jsfiddle.net/8gvhL1dz/22 )
dvlsg

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

toISOString не виводиться у вашому локальному часовому поясі - він завжди знаходиться у (нульовому зміщенні) UTC.
JoeTidee

11

Можливо також з ванільним JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"

3
Тільки якщо ви хочете його в UTC, не підтримуючи часовий пояс.
JoeTidee

8

Коли ви використовуєте Mongoose для зберігання дат у MongoDB, вам потрібно використовувати toISOString (), оскільки всі дати зберігаються як ISOdates з мілісекундами.

moment.format() 

2018-04-17T20:00:00Z

moment.toISOString() -> USE THIS TO STORE IN MONGOOSE

2018-04-17T20:00:00.000Z

3

Якщо ви просто хочете, щоб частина дати (наприклад, 2017-06-27), і ви хотіли, щоб вона працювала незалежно від часового поясу, а також арабською мовою, ось код, який я написав:

function isoDate(date) {
    if (!date) {
        return null
    }
    date = moment(date).toDate()

    // don't call toISOString because it takes the time zone into
    // account which we don't want.  Also don't call .format() because it
    // returns Arabic instead of English

    var month = 1 + date.getMonth()
    if (month < 10) {
        month = '0' + month
    }
    var day = date.getDate()
    if (day < 10) {
        day = '0' + day
    }
    return date.getFullYear() + '-' + month + '-' + day
}

0
var x = moment();

//date.format(moment.ISO_8601); // error

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);

2
Хоча цей код може вирішити питання, краще додати контекст, чому / як він працює. Це може допомогти майбутнім користувачам навчитися та застосувати ці знання до власного коду. Ви також можете мати позитивні відгуки від користувачів у вигляді оновлень, коли пояснюється код.
borchvm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.