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

sen*_*ett 177 javascript iso8601 date-formatting momentjs

这篇文档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
Run Code Online (Sandbox Code Playgroud)

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

如何从moment.js获得ISO 8601?

cyb*_*bat 292

moment().toISOString(); // or format() - see below
Run Code Online (Sandbox Code Playgroud)

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

更新 根据答案:@sennet和@dvlsg的评论(见小提琴)应该注意到format和之间存在差异toISOString.两者都是正确的,但基础过程不同.toISOString转换为Date对象,设置为UTC然后使用本机Date原型函数以UTC(YYYY-MM-DD[T]HH:mm:ss.SSS[Z])输出UTC的ISO8601 .另一方面,format使用默认格式(YYYY-MM-DDTHH:mm:ssZ)而不使用毫秒并保持时区偏移量.

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

  • 如果你想要utc时间,但是格式化你自己的方式,而不是ISO8601,你可以执行以下操作:`moment().utc().format("OUTPUT_FORMAT")` (3认同)
  • 如果您想维护本地时区,请使用“moment().toISOString(true);”。 (3认同)
  • 我同意你@Yashua。我认为应该避免使用“format()”,因为它不直观。此外,我认为根本不应该存在仅包装本机“toISOString()”的函数。话虽如此,也许会提供一个新功能,例如:“toISO8601()”,并可以选择保留时区和适当的文档会更好。 (2认同)

sen*_*ett 73

使用format没有参数:

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

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

  • 正如旁注而言,这两个答案并不相同,即使它们都符合ISO格式要求.`date.toISOString()`将保持毫秒并使用utc,`date.format()`将丢弃毫秒并使用您的本地时区(或者至少,这是我目前在chrome中获得的行为 - http:/ /jsfiddle.net/8gvhL1dz/22/) (27认同)
  • toISOString 不会以您的本地时区输出 - 它始终采用(零偏移)UTC。 (2认同)

小智 12

var date = moment(new Date(), moment.ISO_8601);
console.log(date);
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明一下你的答案吗? (2认同)

art*_*pro 9

也可以使用香草JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
Run Code Online (Sandbox Code Playgroud)

  • 仅当您需要 UTC 时,而不需要维护时区。 (9认同)

web*_*ter 7

当您使用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
Run Code Online (Sandbox Code Playgroud)


Zet*_*taP 7

如果您需要格式化字符串:YYYY-MM-DDTHH:mm:ssZ

var date = moment();
console.log(date.format("YYYY-MM-DDTHH:mm:ssZ"));
Run Code Online (Sandbox Code Playgroud)


use*_*274 5

如果您只想要日期部分(例如 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
}
Run Code Online (Sandbox Code Playgroud)