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

2022-08-30 00:02:37

我有一个对象。如何呈现以下代码段的标题部分?Date

<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"

答案 1

已经有一个名为 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())

答案 2

注意:截至2022-03年,此答案仍在获得支持。此刻.js已弃用。这是两个主要的替代方案:LuxonDay.js,其他的则在弃用链接中提到。

卢克森

Luxon可以被认为是Moment的进化。它由艾萨克·坎布隆(Isaac Cambron)撰写,他是Moment的长期贡献者。请阅读为什么Luxon存在?以及Luxon文档中的“For Moment”用户页面。

地点: 提供国际 时区: 提供国际

日.js

Day.js旨在成为Moment.js的极简主义替代品,使用类似的API。它不是一个直接的替代品,但如果你习惯于使用Moment的API并希望快速行动,请考虑使用Day.js。

区域设置:可单独导入的自定义数据文件 时区:通过插件提供国际

我使用Day.js因为尺寸差异,但Luxon更容易处理。


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

这会丢弃有价值的信息,因为服务器或收件人始终可以将完整的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() 这样的函数,然后其结果可以传递到时刻。

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