代码之家  ›  专栏  ›  技术社区  ›  James A. Rosen

如何在javascript中输出iso 8601格式的字符串?

  •  238
  • James A. Rosen  · 技术社区  · 14 年前

    我有一个 Date 对象。 如何渲染 title 以下片段的一部分?

    <abbr title="2010-04-02T14:12:07">A couple days ago</abbr>
    

    我有另一个图书馆的“相对时间”部分。

    我试过以下方法:

    function isoDate(msSinceEpoch) {
    
       var d = new Date(msSinceEpoch);
       return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
              d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
    
    }
    

    但这给了我:

    "2010-4-2T3:19"
    
    14 回复  |  直到 14 年前
        1
  •  426
  •   APerson sanders    9 年前

    已经有一个名为 toISOString() :

    var date = new Date();
    date.toISOString(); //"2011-12-19T15:28:46.493Z"
    

    如果,不知怎么的,你在 a browser 这不支持,我给你介绍了:

    if ( !Date.prototype.toISOString ) {
      ( function() {
    
        function pad(number) {
          var r = String(number);
          if ( r.length === 1 ) {
            r = '0' + r;
          }
          return r;
        }
    
        Date.prototype.toISOString = function() {
          return this.getUTCFullYear()
            + '-' + pad( this.getUTCMonth() + 1 )
            + '-' + pad( this.getUTCDate() )
            + 'T' + pad( this.getUTCHours() )
            + ':' + pad( this.getUTCMinutes() )
            + ':' + pad( this.getUTCSeconds() )
            + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
            + 'Z';
        };
    
      }() );
    }
    
        2
  •  63
  •   dev-null-dweller    9 年前

    参见第页的最后一个示例 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date :

    /* Use a function for the exact format desired... */
    function ISODateString(d) {
        function pad(n) {return n<10 ? '0'+n : n}
        return d.getUTCFullYear()+'-'
             + pad(d.getUTCMonth()+1)+'-'
             + pad(d.getUTCDate())+'T'
             + pad(d.getUTCHours())+':'
             + pad(d.getUTCMinutes())+':'
             + pad(d.getUTCSeconds())+'Z'
    }
    
    var d = new Date();
    console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z
    
        3
  •  58
  •   Daniel F    11 年前

    几乎web上的每个to iso方法都会在输出字符串之前应用转换为“z”ulu time(utc)来删除时区信息。浏览器的native.toisostring()还会删除时区信息。

    这将丢弃有价值的信息,因为服务器或收件人始终可以将完整的ISO日期转换为zulu时间或其所需的任何时区,同时仍然可以获取发件人的时区信息。

    我遇到的最好的解决方案是使用 Moment.js javascript库并使用以下代码:

    使用时区信息和毫秒获取当前ISO时间

    now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
    // "2013-03-08T20:11:11.234+0100"
    
    now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
    // "2013-03-08T19:11:11.234+0000"
    
    now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
    // "2013-03-08T19:11:11Z" <- better use the native .toISOString() 
    

    获取本地javascript日期对象的iso时间,该对象包含时区信息,但不包含毫秒

    var current_time = Date.now();
    moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")
    

    这可以与date.js结合使用,得到date.today()这样的函数,其结果可以传递给moment。

    这种格式的日期字符串是json编译器,可以很好地存储到数据库中。python和c似乎很喜欢。

        4
  •  24
  •   Peter Mortensen Sumit Kumar    9 年前

    问题是ISO格式 具有 精度降低。沃伊拉:

     new Date().toISOString().slice(0, 19) + 'Z'
     // '2014-10-23T13:18:06Z'
    

    假设需要后面的z,否则就省略。

        5
  •  12
  •   Russell Davis    12 年前

    如果你不需要支持IE7,以下是一个非常简单的技巧:

    JSON.parse(JSON.stringify(new Date()))
    
        6
  •  11
  •   Peter Mortensen Sumit Kumar    9 年前

    最短,但不受Internet Explorer 8及更早版本支持:

    new Date().toJSON()
    
        7
  •  6
  •   Wayne Maurer    6 年前

    我通常不想显示UTC日期,因为客户不喜欢在头脑中进行转换。显示一个 地方的 ISO日期,我使用函数:

    function toLocalIsoString(date, includeSeconds) {
        function pad(n) { return n < 10 ? '0' + n : n }
        var localIsoString = date.getFullYear() + '-'
            + pad(date.getMonth() + 1) + '-'
            + pad(date.getDate()) + 'T'
            + pad(date.getHours()) + ':'
            + pad(date.getMinutes()) + ':'
            + pad(date.getSeconds());
        if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
        return localIsoString;
    };
    

    上面的函数忽略了时区偏移信息(除非本地时间恰好是UTC),所以我使用下面的函数在单个位置显示本地偏移。如果希望每次都显示偏移量,也可以将其输出附加到上述函数的结果中:

    function getOffsetFromUTC() {
        var offset = new Date().getTimezoneOffset();
        return ((offset < 0 ? '+' : '-')
            + pad(Math.abs(offset / 60), 2)
            + ':'
            + pad(Math.abs(offset % 60), 2))
    };
    

    toLocalIsoString 使用 pad . 如果需要,它的工作原理几乎与任何pad函数类似,但为了完整起见,我使用的是:

    // Pad a number to length using padChar
    function pad(number, length, padChar) {
        if (typeof length === 'undefined') length = 2;
        if (typeof padChar === 'undefined') padChar = '0';
        var str = "" + number;
        while (str.length < length) {
            str = padChar + str;
        }
        return str;
    }
    
        8
  •  3
  •   kaiz.net    14 年前

    “t”后面缺少“+”

    isoDate: function(msSinceEpoch) {
      var d = new Date(msSinceEpoch);
      return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T'
             + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
    }
    

    应该这么做。

    对于前导零,可以从 here :

    function PadDigits(n, totalDigits) 
    { 
        n = n.toString(); 
        var pd = ''; 
        if (totalDigits > n.length) 
        { 
            for (i=0; i < (totalDigits-n.length); i++) 
            { 
                pd += '0'; 
            } 
        } 
        return pd + n.toString(); 
    } 
    

    像这样使用:

    PadDigits(d.getUTCHours(),2)
    
        9
  •  3
  •   Sean    8 年前
    function timeStr(d) { 
      return ''+
        d.getFullYear()+
        ('0'+(d.getMonth()+1)).slice(-2)+
        ('0'+d.getDate()).slice(-2)+
        ('0'+d.getHours()).slice(-2)+
        ('0'+d.getMinutes()).slice(-2)+
        ('0'+d.getSeconds()).slice(-2);
    }
    
        10
  •  3
  •   Useful Angle    8 年前

    toisostring的问题是它只将datetime指定为“z”。

    ISO-8601还以小时和分钟为单位用时区差定义了日期时间,格式为2016-07-16T19:20:30+5:30(当时区在UTC之前时)和2016-07-16T19:20:30-01:00(当时区在UTC之后时)。

    我不认为用另一个插件moment.js来完成这么小的任务是个好主意,特别是当你只需要几行代码就可以完成的时候。

    
    
        var timezone_offset_min = new Date().getTimezoneOffset(),
            offset_hrs = parseInt(Math.abs(timezone_offset_min/60)),
            offset_min = Math.abs(timezone_offset_min%60),
            timezone_standard;
    
        if(offset_hrs < 10)
            offset_hrs = '0' + offset_hrs;
    
        if(offset_min > 10)
            offset_min = '0' + offset_min;
    
        // getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa.
        // So add an opposite sign to the offset
        // If offset is 0, it means timezone is UTC
        if(timezone_offset_min < 0)
            timezone_standard = '+' + offset_hrs + ':' + offset_min;
        else if(timezone_offset_min > 0)
            timezone_standard = '-' + offset_hrs + ':' + offset_min;
        else if(timezone_offset_min == 0)
            timezone_standard = 'Z';
    
        // Timezone difference in hours and minutes
        // String such as +5:30 or -6:00 or Z
        console.log(timezone_standard); 
    
    
    

    一旦以小时和分钟为单位获得时区偏移量,就可以追加到日期时间字符串。

    我在上面写了一篇博文: http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes

        11
  •  2
  •   Anurag    14 年前

    我就用这个小分机 Date - http://blog.stevenlevithan.com/archives/date-time-format

    var date = new Date(msSinceEpoch);
    date.format("isoDateTime"); // 2007-06-09T17:46:21
    
        12
  •  2
  •   Srikanth Srikanth    7 年前

    我能用很少的代码得到低于输出的结果。

    var ps = new Date('2010-04-02T14:12:07')  ;
    ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";
    

    输出:

    Fri Apr 02 2010 19:42 hrs
    
        13
  •  0
  •   Jonas Byström    9 年前
    function getdatetime() {
        d = new Date();
        return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1)
            .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z')
            .replace(/-(\d)T/,'-0$1T');
    }
    

    我在某个地方找到了stack overflow的基础知识(我相信它是其他stack exchange code golfing的一部分),我对它进行了改进,使其在internet explorer 10或更早版本上也能工作。这很难看,但能完成任务。

        14
  •  0
  •   Juha Untinen    6 年前

    为了用一些甜言蜜语和现代语法来扩展肖恩伟大而简洁的回答:

    // date.js
    
    const getMonthName = (num) => {
      const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
      return months[num];
    };
    
    const formatDate = (d) => {
      const date = new Date(d);
      const year = date.getFullYear();
      const month = getMonthName(date.getMonth());
      const day = ('0' + date.getDate()).slice(-2);
      const hour = ('0' + date.getHours()).slice(-2);
      const minutes = ('0' + date.getMinutes()).slice(-2);
    
      return `${year} ${month} ${day}, ${hour}:${minutes}`;
    };
    
    module.exports = formatDate;
    

    然后如

    import formatDate = require('./date');
    
    const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
    console.log(formatDate(myDate)); // 2018 Jul 24, 13:44