首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在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

Stack Overflow用户

发布于 2020-08-05 14:38:21

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

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

示例用法:

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

票数 2
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17415579

复制
相关文章

相似问题

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