首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在JavaScript中使用ISO8601时区偏移格式化日期?

如何在JavaScript中使用ISO8601时区偏移格式化日期?
EN

Stack Overflow用户
提问于 2013-07-02 08:19:17
回答 12查看 197.7K关注 0票数 151

目标:找到local timeUTC time offset,然后构造以下格式的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晚5小时。

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

1.通过格式获取本地时间

代码语言:javascript
复制
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

输出

代码语言:javascript
复制
2013-07-02T09:00:00

2.按小时获取UTC时间偏移量

代码语言:javascript
复制
var offset = local.getTimezoneOffset() / 60;

输出

代码语言:javascript
复制
7

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

代码语言:javascript
复制
var duration = local + "-" + offset + ":00";

输出:

代码语言:javascript
复制
2013-07-02T09:00:00-7:00

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

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

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

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-07-02 08:35:10

下面是一个简单的帮助器函数,它将为您格式化JS日期。

代码语言:javascript
复制
function toIsoString(date) {
  var tzo = -date.getTimezoneOffset(),
      dif = tzo >= 0 ? '+' : '-',
      pad = function(num) {
          var norm = Math.floor(Math.abs(num));
          return (norm < 10 ? '0' : '') + norm;
      };

  return date.getFullYear() +
      '-' + pad(date.getMonth() + 1) +
      '-' + pad(date.getDate()) +
      'T' + pad(date.getHours()) +
      ':' + pad(date.getMinutes()) +
      ':' + pad(date.getSeconds()) +
      dif + pad(tzo / 60) +
      ':' + pad(tzo % 60);
}

var dt = new Date();
console.log(toIsoString(dt));

票数 243
EN

Stack Overflow用户

发布于 2013-07-02 08:58:46

getTimezoneOffset()返回与参照的等级库所需格式相反的符号。

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

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

此外,本机Date对象上没有名为format的方法,因此#1中的函数将失败,除非您使用库来实现此目的。请参阅this documentation

如果您正在寻找可以直接使用此格式的库,我建议您尝试使用moment.js。实际上,这是默认格式,所以您可以简单地这样做:

代码语言:javascript
复制
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

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

票数 75
EN

Stack Overflow用户

发布于 2019-10-31 05:06:10

我认为值得考虑的是,您只需对标准库进行一次API调用即可获得所需的信息……

代码语言:javascript
复制
new Date().toLocaleString( 'sv', { timeZoneName: 'short' } );

// produces "2019-10-30 15:33:47 GMT−4"

如果要添加分隔符“T”、删除“GMT-”或在末尾附加“:00”,则必须进行文本交换。

但是,如果你想使用the other options,你可以很容易地使用它。使用12小时时间或省略秒等。

请注意,我使用瑞典作为区域设置,因为它是使用ISO8601格式的国家之一。我认为大多数ISO国家使用这种'GMT-4‘格式作为时区偏移量,除了加拿大使用时区缩写,例如。“美国东部夏令时”表示东部夏令时。

您可以从较新的标准i18n函数"Intl.DateTimeFormat()“中获得相同的结果,但您必须通过选项告诉它包含时间,否则它只会给出日期。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17415579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档