Как мне отформатировать дату как 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 2.7.0. Уточнил в вопросе. Смотри мой ответ, я понял это. Документы не очень ясно, хотя.
Сеннетт
Да, они упоминают только специальные форматы в контексте анализа. Странный.
Евангелие от
2
moment().toISOString()
ты

Ответы:

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

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

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

Я открыл проблему, так как думаю, что это может привести к неожиданным результатам.

cyberwombat
источник
1
Я согласен с тобой @Yashua. Я думаю, что следует избегать использования "format ()", потому что это не интуитивно понятно. Кроме того, я не думаю, что функция, которая просто оборачивает "toISOString ()", должна вообще существовать. При этом, возможно, будет лучше использовать новую функцию, например: «toISO8601 ()» с возможностью сохранения часового пояса и надлежащей документации.
Грейвин Лопес
4
Если вы хотите, чтобы время истекало, но форматировалось по-своему, вместо ISO8601, вы можете сделать следующее:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Полезно для форматирования даты в кибане, но у вас нет доступа к JS.
Брайс
1
Если вы хотите сохранить местный часовой пояс, используйте moment().toISOString(true);.
Бенни Нойгебауэр
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()сбрасывать миллисекунды и использовать ваш местный часовой пояс (или, по крайней мере, именно такое поведение я сейчас наблюдаю в chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg
Использование .format () с арабским языком приводит к арабским символам, а не к английским, что, вероятно, нежелательно.
user393274
toISOString не выводится в вашем местном часовом поясе - он всегда находится в (нулевое смещение) UTC.
JoeTidee
11

Также возможно с ванильным JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
источник
3
Только если вы хотите это в UTC, без сохранения часового пояса.
JoeTidee
8

Когда вы используете Mongoose для хранения дат в MongoDB, вам нужно использовать toISOString (), потому что все даты хранятся в виде ISO-дат с миллисекундами.

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
}
user393274
источник
0
var x = moment();

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

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);
nishith
источник
2
Хотя этот код может обеспечить решение вопроса, лучше добавить контекст относительно того, почему / как он работает. Это может помочь будущим пользователям учиться и применять эти знания в своем собственном коде. Вы также, вероятно, получите положительные отзывы от пользователей в виде откликов, когда код объясняется.
Борчвм