首页 文章

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

提问于
浏览
131

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

5 回答

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

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

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

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

  • 1

    使用 format 没有参数:

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

    http://jsfiddle.net/8gvhL1dz/

  • 7

    也可以使用香草JS

    new Date().toISOString() // "2017-08-26T16:31:02.349Z"
    
  • 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
    }
    
  • 64

    当您使用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
    

相关问题