Как мне форматировать дату как ISO 8601 в moment.js?

В этом документе упоминается 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 от момента .js?

Ответ 1

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) без миллисекунд и поддерживает смещение часового пояса.

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

Ответ 2

Используйте format без параметров:

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

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

Ответ 3

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

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

Ответ 4

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