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

目标: 找到 "本地时间 "和 "UTC 时间偏移",然后按以下格式构建 URL。

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

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

文档说

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

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

1.Get local time with format

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

输出

2013-07-02T09:00:00

2.Get UTC time offset by hour

var offset = local.getTimezoneOffset() / 60;

输出

7

3.Construct URL (time part only)

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

输出:

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

上述输出表示我的当地时间是 2013/07/02 上午 9 点,与协调世界时的时差是 7 小时(协调世界时比当地时间早 7 小时)。

目前看来是可行的,但**如果 getTimezoneOffset() 返回负值(如-120)怎么办?

我想知道在这种情况下格式应该是怎样的,因为我无法从 W3C 文档中找到答案。在此先表示感谢。

解决办法

所有浏览器均可正常使用以下设置(感谢 @MattJohnson 提供的提示)

评论(18)

getTimezoneOffset()`返回与您引用的规范所要求的格式相反的符号。

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

在这种格式中,UTC 用 "Z "表示,而所有其他格式都用UTC 的偏移量表示。 其含义与 JavaScript&#39 相同,但减法顺序颠倒,因此结果带有相反的符号。

此外,本地 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

这是一个久经考验的跨浏览器解决方案,还具有许多其他有用的功能。

评论(2)

这是我为客户提供的时区功能,轻便简单

  function getCurrentDateTimeMySql() {        
      var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
      var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
      var mySqlDT = localISOTime;
      return mySqlDT;
  }
评论(1)