当前位置: 首页 > 知识库问答 >
问题:

ISO8601如何在JavaScript中格式化带有时区偏移量的日期?

曾泳
2023-03-14

目标:找到本地时间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晚5个小时。

因此,根据我的理解,我需要通过new 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;
7
var duration = local + "-" + offset + ":00";
2013-07-02T09:00:00-7:00

到目前为止,它似乎起作用了,但是如果getTimezoneOffset()返回负值,比如-120呢?

我想知道这种情况下的格式应该是什么样子的,因为我无法从W3C文档中找到答案。提前道谢。

共有1个答案

桂高昂
2023-03-14

以下内容应该可以正常工作,并且适用于所有浏览器(感谢@mattjohnson提供的提示)

js prettyprint-override">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));
 类似资料:
  • 问题内容: 目标: 找到,然后以以下格式构建网址。 范例网址:/ Actions / Sleep?duration = 2002-10-10T12:00:00−05:00 该文件说: 例如,2002-10-10T12:00:00-05:00(2002年10月10日中午,美国中部夏令时以及美国东部标准时间)等于2002-10-10T17:00:00Z,比2002-10-10T12:00:00Z晚五个

  • 我有一个客户端JavaScript,它用JavaScript生成日期()。 我需要这个日期传递到一个隐藏的字段,后面的代码可以访问。 我的问题是,当隐藏字段转换为DotNet datetime时,时间是不正确的。这是因为JavaScript包含来自客户端浏览器的时区信息。 然后,DotNet使用此信息根据服务器时间和客户端时间之间的差异重新计算时间。 我需要的是JavaScript中的年、月和日。

  • 问题内容: 我正在使用bootstrap-datetimepicker和ISO8601 datetime格式,如其选项部分所述 在我的控制器中 它以(console.log)将数据发送到后端 并保存为数据库 在我的模板中 我在HTML上看到的输出为 但是根据Angular doc,它应该用于格式 我想念的是什么? 问题答案: 现在,我已经创建了一个过滤器 作为依赖项添加为 并用作 并将日期显示为

  • 我需要将查询中的日期值转换为带有时区的时间戳,但目前我得到的时区区域(“欧洲/巴黎”)是EF使用的无效区域。 例如,在执行此操作时:

  • 有没有办法将ISO8601日期与Java进行比较?比如,知道字符串日期是否是良好的格式,知道月份是否为负数,以及 我还在搜索如何知道互联网上是否有课程可以比较两个ISO8601日期?比如,如果我有:2000-12-12和1999-05-06。我如何比较这两个日期,使之在年、月和日之间有准确的差异?

  • 问题内容: 我知道相反。给定一个时区,我可以通过以下代码片段获取时区偏移量: 我想知道如何从时区偏移量获取时区名称。 鉴于 (以毫秒为单位; +6.00偏移) 我想得到以下任何可能的时区名称的结果: 问题答案: 用