如何用JavaScript中的Timezone偏移来格式化日期?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

目标:找到local time并按UTC time offset以下格式构建网址。

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

格式基于W3C的建议:http : //www.w3.org/TR/xmlschema11-2/#dateTime

该文件说:

 For example, 2002-10-10T12:00:00−05:00 (noon on 10 October 2002, 
Central Daylight Savings Time as well as Eastern Standard Time in the U.S.) 
is equal to 2002-10-10T17:00:00Z, five hours later than 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;

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

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

输出:

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

以上输出表示当地时间为2013/07/02上午9点,与UTC的时差为7小时(UTC比当地时间提前7小时)

到目前为止,它似乎工作,但如果getTimezoneOffset()返回负值,如-120?

我想知道这种格式应该是什么样子,因为我无法从W3C文档中找到它。提前致谢。

提问于
用户回答回答于

下面应该正常工作,并为所有浏览器

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());

用户回答回答于

getTimezoneOffset() 返回您引用的规范所需格式的相反符号。

这种格式也被称为ISO8601,或者更准确地称为RFC3339

在这种格式中,UTC表示一段Z时间,其他所有格式均由UTC的偏移量表示。其含义与JavaScript相同,但减法的顺序是倒置的,所以结果的符号相反。

另外,在本地Date对象上没有方法调用format,因此#1中的函数将失败,除非您使用库来实现此目的。请参阅此文档

如果你正在寻找一个可以直接使用这种格式的图书馆,我建议你尝试一下moment.js。事实上,这是默认格式,所以你可以简单地这样做:

var m = moment();    // get "now" as a moment
var s = m.format();  // the ISO format is the default so no parameters are needed

// sample output:   2013-07-01T17:55:13-07:00

这是一个经过充分测试的跨浏览器解决方案,并具有许多其他有用的功能。

扫码关注云+社区