搜索

首页  >  问答  >  正文

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

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

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

该格式基于 W3C 推荐。文档说:

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

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

  1. 使用 format 获取当地时间

    var local = new Date().format("yyyy-MM-ddThh:mm:ss"); // 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年7月2日上午9点,与UTC相差7个小时(UTC比当地时间早7个小时)

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

我想知道在这种情况下格式应该是什么样子,因为我无法从 W3C 文档中弄清楚。

P粉054616867P粉054616867292 天前822

全部回复(2)我来回复

  • P粉842215006

    P粉8422150062024-03-26 13:16:45

    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

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

    回复
    0
  • P粉545956597

    P粉5459565972024-03-26 12:26:52

    这是一个简单的辅助函数,可以为您格式化 JS 日期。

    function toIsoString(date) {
      var tzo = -date.getTimezoneOffset(),
          dif = tzo >= 0 ? '+' : '-',
          pad = function(num) {
              return (num < 10 ? '0' : '') + num;
          };
    
      return date.getFullYear() +
          '-' + pad(date.getMonth() + 1) +
          '-' + pad(date.getDate()) +
          'T' + pad(date.getHours()) +
          ':' + pad(date.getMinutes()) +
          ':' + pad(date.getSeconds()) +
          dif + pad(Math.floor(Math.abs(tzo) / 60)) +
          ':' + pad(Math.abs(tzo) % 60);
    }
    
    var dt = new Date();
    console.log(toIsoString(dt));

    回复
    0
  • 取消回复