Как мне форматировать дату как 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
}