如何在moment.js中将date格式化为ISO 8601?

这个文档提到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/ )

如何从moment.js获得ISO 8601?

 var date = moment(); date.toISOString(); // or format() - see below 

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

更新根据答案:@sennet和@dvlsg的注释(请参阅Fiddle )应该注意的是formattoISOString之间有区别。 两者都是正确的,但基本的过程不同。 toISOString转换为Date对象,设置为UTC,然后使用本地Date原型函数以毫秒( YYYY-MM-DD[T]HH:mm:ss.SSS[Z] )以UTC输出ISO8601。 另一方面, format使用默认格式( YYYY-MM-DDTHH:mm:ssZ ),毫秒级并保持时区偏移量。

我开了一个问题,因为我认为这可能会导致意想不到的结果。

使用不带参数的format

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

http://jsfiddle.net/8gvhL1dz/

也可以用香草JS

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

如果您只想要date部分(例如2017-06-27),并且您希望它能够工作而不pipe时区和阿拉伯语,下面是我写的代码:

 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 }