如何在 JavaScript 中输出 ISO 8601 格式的字符串?

IT技术 javascript datetime iso8601
2021-02-05 05:22:01

我有一个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"
6个回答

已经有一个函数叫做toISOString()

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

如果不知何故,您使用的浏览器不支持它,我会为您提供帮助:

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';
    };

  }());
}

console.log(new Date().toISOString())

如果您想将日期对象传递给肥皂服务……那就是方法!:) 谢谢。
2021-03-12 05:22:01
.toISOString() 肯定会返回 UTC 中的日期?
2021-03-21 05:22:01
所有像“getUTCFullYear”这样的函数调用都失败了,因为它们对于 IE 文档模式 5 来说是未知的。
2021-03-23 05:22:01
new Date("xx").toISOString()产生NaN-NaN-NaNTNaN:NaN:NaN.NZ本机实现抛出 RangeException。
2021-03-30 05:22:01
在 OP 提供的示例中,没有毫秒或时区。
2021-04-05 05:22:01

请参阅页面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
OP ( <abbr title="2010-04-02T14:12:07">)提供的示例没有时区。也许他们想要当地时间,这对 UI 时间字符串有意义吗?
2021-03-28 05:22:01

几乎所有网络上的 to-ISO 方法都通过在输出字符串之前应用转换为“Z”ulu 时间 (UTC) 来删除时区信息。浏览器的原生 .toISOString() 也会删除时区信息。

这会丢弃有value的信息,因为服务器或收件人始终可以将完整的 ISO 日期转换为祖鲁时间或它需要的任何时区,同时仍能获取发件人的时区信息。

我遇到的最佳解决方案是使用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 Date 对象的 ISO 时间

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

这可以与 Date.js 结合使用,以获得像 Date.today() 这样的函数,然后可以将其结果传递给 moment。

像这样格式化的日期字符串是 JSON 兼容的,并且很适合存储到数据库中。Python 和 C# 似乎喜欢它。

也许很挑剔,但这些示例返回与 UTC 的当前偏移量,而不是时区。时区是一个地理区域,通常表示为例如“美国/多伦多”。许多时区每年更改两次它们的 UTC 偏移量,并且时区不能(总是)从当前的 UTC 偏移量中确定......因此这个答案也删除了时区信息:-)
2021-03-13 05:22:01
实际上,在 python 和 db 上,结果证明是一种痛苦。db 使用 UTC(没有问题,因为您可以轻松转换为 UTC 服务器端),因此如果您想保留偏移信息,您需要另一个字段。Python 更喜欢使用纳秒而不是 javascript 的毫秒,这通常就足够了,而且比普通秒更可取。在 python 上,只有dateutil.parser.parse正确解析它,并且写毫秒 ISO 需要一个 "_when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z "); return _when[:-8] + _when[-5:]" 将纳米转换为毫秒。那不好。
2021-03-15 05:22:01
不要和约会的人在一起。只需使用 moment.js 并保存您的头发。
2021-03-24 05:22:01
好点@user193130,但您确实需要小心,因为输出与本机方法不同。 moment().format() "2015-03-04T17:16:05+03:00" (new Date()).toISOString() "2015-03-04T14:16:24.555Z"
2021-03-26 05:22:01
您实际上可以像这样省略格式:moment(new Date()).format(). “从 1.5.0 版开始,在没有格式的情况下调用 moment#format 将默认为 ... ISO8601 格式YYYY-MM-DDTHH:mm:ssZ”。文档:从momentjs.com/docs/#/displaying/fromnow向上滚动
2021-04-09 05:22:01

问的问题是ISO格式降低精度。瞧:

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

假设需要尾随 Z,否则只需省略。

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

new Date().toJSON()