How to ISO 8601 format a Date with Timezone Offset in JavaScript?
目标:找到
示例URL:/ Actions / Sleep?duration = 2002-10-10T12:00:00?05:00
格式基于W3C建议:
http://www.w3.org/TR/xmlschema11-2/#dateTime
文件说:
For example, 2002-10-10T12:00:00?05:00 (noon on 10 October 2002,
Central Daylight Savings Time as well as Eastern Standard Time in the U.S.)
is equal to 2002-10-10T17:00:00Z, five hours later than 2002-10-10T12:00:00Z.
所以基于我的理解,我需要通过新的Date()找到我的本地时间,然后使用getTimezoneOffset()函数来计算差异,然后将它附加到字符串的末尾。
1.以格式获取当地时间
1 | var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time) |
产量
1 | 2013-07-02T09:00:00 |
2.以小时为单位获取UTC时间偏移量
1 | var offset = local.getTimezoneOffset() / 60; |
产量
1 | 7 |
3.Construct URL(仅限时间部分)
1 | var duration = local +"-" + offset +":00"; |
输出:
1 | 2013-07-02T09:00:00-7:00 |
以上输出结果表示我的当地时间是2013/07/02 9am,与UTC的差异是7小时(UTC是比当地时间早7小时)
到目前为止它似乎工作,但如果getTimezoneOffset()返回负值如-120怎么办?
我想知道在这种情况下格式应该是什么样的,因为我无法从W3C文档中找到答案。提前致谢。
以下应该适用于所有浏览器(感谢@MattJohnson提示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Date.prototype.toIsoString = function() { var tzo = -this.getTimezoneOffset(), dif = tzo >= 0 ? '+' : '-', pad = function(num) { var norm = Math.floor(Math.abs(num)); return (norm < 10 ? '0' : '') + norm; }; return this.getFullYear() + '-' + pad(this.getMonth() + 1) + '-' + pad(this.getDate()) + 'T' + pad(this.getHours()) + ':' + pad(this.getMinutes()) + ':' + pad(this.getSeconds()) + dif + pad(tzo / 60) + ':' + pad(tzo % 60); } var dt = new Date(); console.log(dt.toIsoString()); |
这种格式也称为ISO8601,或者更准确地称为RFC3339。
在此格式中,UTC用
此外,在名为
如果您正在寻找可以直接使用此格式的库,我建议您尝试使用moment.js。实际上,这是默认格式,因此您可以简单地执行此操作:
1 2 3 4 | 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 |
这是一个经过良好测试的跨浏览器解决方案,并具有许多其他有用的功能。
这是我对客户时区的功能,它重量轻,简单
1 2 3 4 5 6 | 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; } |
检查一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 ? '-' : '+') + (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' |
只是我的两个发送到这里
我在日期时遇到了这个问题所以我做的是这样的:
1 2 3 | const moment = require('moment-timezone') const date = moment.tz('America/Bogota').format() |
然后将日期保存到db,以便能够从某个查询中进行比较。
要安装
1 | npm i moment-timezone |