登录

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

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2019-11-15
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2013-07-02 08:19

目标: 找到 local time UTC 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.通过格式获取本地时间

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

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

输出:

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

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

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

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

浏览 218 关注 0 得票数 151
  • 得票数为Stack Overflow原文数据
原文
修改于2021-11-09
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2013-07-02 08:35
得票数 243

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

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));

修改于2015-09-25
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2013-07-02 08:58
得票数 75

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

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

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

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

如果您正在寻找可以直接使用此格式的库,我建议您尝试使用 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

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

回答于2018-05-26
得票数 7

这是我的客户端时区函数,它轻量级且简单

  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;
  }
修改于2021-10-07
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2019-02-22 07:48
得票数 3

这里只有我的两点意见

我在使用datetimes时遇到了这个问题,所以我所做的是:

const moment = require('moment-timezone')
const date = moment.tz('America/Bogota').format()

然后将日期保存到数据库中,以便能够从某个查询中进行比较。

安装 moment-timezone 的步骤

npm i moment-timezone
修改于2021-05-23
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2019-06-22 03:13
得票数 6

请检查以下内容:

function dateToLocalISO(date) {
    const off    = date.getTimezoneOffset()
    const absoff = Math.abs(off)
    return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +
            (off > 0 ? '-' : '+') + 
            Math.floor(absoff / 60).toFixed(0).padStart(2,'0') + ':' + 
            (absoff % 60).toString().padStart(2,'0'))
// Test it:
d = new Date()
dateToLocalISO(d)
// ==> '2019-06-21T16:07:22.181-03:00'
// Is similar to:
moment = require('moment')
moment(d).format('YYYY-MM-DDTHH:mm:ss.SSSZ') 
// ==> '2019-06-21T16:07:22.181-03:00'
回答于2019-10-31
得票数 31

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

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()“中获得相同的结果,但您必须通过选项告诉它包含时间,否则它只会给出日期。

回答于2020-01-15
得票数 2

不需要moment.js :这是一个完整的往返答案,来自“datetime-”的 输入本地类型,它在格林威治时间将一个ISOLocal字符串输出到UTCseconds,然后返回:

<input type="datetime-local" value="2020-02-16T19:30">
isoLocal="2020-02-16T19:30"
utcSeconds=new Date(isoLocal).getTime()/1000
//here you have 1581899400 for utcSeconds
let isoLocal=new Date(utcSeconds*1000-new Date().getTimezoneOffset()*60000).toISOString().substring(0,16)
2020-02-16T19:30
回答于2020-02-24
得票数 14

对于那些只想要YYYY-MM-DD格式的本地时区中的今天日期的人,我的答案略有不同。

让我说清楚:

我的目标: today's date in 用户的时区,但格式为ISO8601 (YYYY-MM-DD)

代码如下:

new Date().toLocaleDateString("sv") // "2020-02-23" // 

这是因为瑞典的区域设置使用ISO 8601格式。

修改于2020-07-22
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2020-07-22 21:59
得票数 1

以下是我用于此目的的函数:

function localToGMTStingTime(localTime = null) {
    var date = localTime ? new Date(localTime) : new Date();
    return new Date(date.getTime() + (date.getTimezoneOffset() * 60000)).toISOString();
function GMTToLocalStingTime(GMTTime = null) {
    var date = GMTTime ? new Date(GMTTime) : new Date();;
    return new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
};
原文
回答于2020-08-05
得票数 2

您可以通过几个简单的扩展方法来实现这一点。下面的日期扩展方法只返回ISO格式的时区部分,然后您可以为日期/时间部分定义另一个部分,并将它们组合成一个完整的日期-时间-偏移量字符串。

Date.prototype.getISOTimezoneOffset = function () {
    const offset = this.getTimezoneOffset();
    return (offset < 0 ? "+" : "-") + Math.floor(Math.abs(offset / 60)).leftPad(2) + ":" + (Math.abs(offset % 60)).leftPad(2);
Date.prototype.toISOLocaleString = function () {
    return this.getFullYear() + "-" + (this.getMonth() + 1).leftPad(2) + "-" +
        this.getDate().leftPad(2) + "T" + this.getHours().leftPad(2) + ":" +
        this.getMinutes().leftPad(2) + ":" + this.getSeconds().leftPad(2) + "." +
        this.getMilliseconds().leftPad(3);
Number.prototype.leftPad = function (size) {
    var s = String(this);
    while (s.length < (size || 2)) {
        s = "0" + s;
    return s;
}

示例用法:

var date = new Date();
console.log(date.toISOLocaleString() + date.getISOTimezoneOffset());
// Prints "2020-08-05T16:15:46.525+10:00"

我知道现在是2020年了,大多数人可能已经在使用Moment.js了,但简单的复制和粘贴解决方案有时还是很方便的。

(我之所以将日期/时间和偏移量方法分开,是因为我使用的是一个旧的 Datejs 库,它已经提供了一个具有自定义格式说明符的灵活 toString 方法,但不包括时区偏移量。因此,我为没有使用该库的任何人添加了 toISOLocaleString 。)

回答于2020-10-26
得票数 0
function setDate(){
    var now = new Date();
    now.setMinutes(now.getMinutes() - now.getTimezoneOffset());
    var timeToSet = now.toISOString().slice(0,16);
        If you have an element called "eventDate" like the following:
        <input type="datetime-local" name="eventdate" id="eventdate" />
        and you would like to  set the current and minimum time then use the following:
    var elem = document.getElementById("eventDate");
    elem.value = timeToSet;
    elem.min = timeToSet;