如何在ISO 8601格式的date与时区偏移在JavaScript中?

目标:查找local timeUTC time offset然后按照以下格式构buildURL。

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

格式基于W3C的build议: 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 US) is equal to 2002-10-10T17:00:00Z, five hours later than 2002-10-10T12:00:00Z. 

所以基于我的理解,我需要通过新的Date()来查找我的本地时间,然后使用getTimezoneOffset()函数来计算差异,然后将其附加到string的末尾。

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.构buildURL(仅限时间部分)

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

输出:

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

以上输出表示我当地的时间是2013/07/02上午9点,与UTC的时差是7小时(UTC比当地时间早7个小时)

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

我想知道这种格式应该是什么样子,因为我不能从W3C文档中找出来。 提前致谢。

下面应该正常工作,并为所有浏览器(感谢@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()); 

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

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

在这种格式中,UTC用Z表示,而所有其他格式用UTC的偏移表示。 其含义与JavaScript相同,但是减法的顺序是相反的,所以结果是相反的。

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

如果您正在寻找一个可以直接使用这种格式的图书馆,我build议尝试一下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 

这是一个经过良好testing的跨浏览器解决scheme,并具有许多其他有用的function。