一尘不染

ISO 8601如何在JavaScript中格式化带有时区偏移的日期?

javascript

目标: 找到local timeUTC time offset然后以以下格式构建网址。

范例网址:/ Actions / Sleep?duration = 2002-10-10T12:00:00−05:00

该文件说:

例如,2002-10-10T12:00:00-05:00(2002年10月10日中午,美国中部夏令时以及美国东部标准时间)等于2002-10-10T17:00:00Z,比2002-10-10T12:00:00Z晚五个小时。

因此,根据我的理解,我需要通过新的Date()查找我的本地时间,然后使用getTimezoneOffset()函数计算时差,然后将其附加到字符串的末尾。

1.获取本地时间格式

var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

输出

2013-07-02T09:00:00

2.获取UTC时间以小时为单位

var offset = local.getTimezoneOffset() / 60;

输出

7

3.构造URL(仅限时间部分)

var duration = local + "-" + offset + ":00";

输出:

2013-07-02T09:00:00-7:00

上面的输出表示我的本地时间是2013/07/02 9am,与UTC的时差是7小时(UTC比本地时间早7小时)

到目前为止,它似乎仍然有效,但是 如果getTimezoneOffset()返回负值(如-120)怎么办?

我想知道这种情况下的格式应该如何,因为我无法从W3C文档中弄清楚。提前致谢。


阅读 268

收藏
2020-04-25

共1个答案

一尘不染

下面的代码应该可以正常运行,并且适用于所有浏览器(感谢@MattJohnson作为提示)

Date.prototype.toIsoString = function() {

    var tzo = -this.getTimezoneOffset(),

        dif = tzo >= 0 ? '+' : '-',

        pad = function(num) {

            var norm = Math.floor(Math.abs(num));

            return (norm < 10 ? '0' : '') + norm;

        };

    return this.getFullYear() +

        '-' + pad(this.getMonth() + 1) +

        '-' + pad(this.getDate()) +

        'T' + pad(this.getHours()) +

        ':' + pad(this.getMinutes()) +

        ':' + pad(this.getSeconds()) +

        dif + pad(tzo / 60) +

        ':' + pad(tzo % 60);

}



var dt = new Date();

console.log(dt.toIsoString());
2020-04-25