目标:找到local time
和UTC time offset
,然后按以下格式构建网址。
示例网址:/ 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个小时。
基于我的理解,我需要通过新的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.Construct URL(仅限时间部分)
var duration = local + "-" + offset + ":00";
输出:
2013-07-02T09:00:00-7:00
以上输出表示我的当地时间是2013/07/02上午9点,与UTC的差异为7小时(UTC比当地时间早7小时)
到目前为止它似乎有效但如果getTimezoneOffset()返回-120这样的负值会怎样?
我想知道在这种情况下格式应该是什么样的,因为我无法从W3C文档中找到答案。提前谢谢。
答案 0 :(得分:141)
下面应该可以正常使用,适用于所有浏览器(感谢@MattJohnson提示)
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());
答案 1 :(得分:61)
getTimezoneOffset()
会返回您引用的规范所需格式的相反符号。
在此格式中,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
这是一个经过良好测试的跨浏览器解决方案,还有许多其他有用的功能。
答案 2 :(得分:2)
这是我对客户时区的功能,它的重量轻,简单
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;
}
答案 3 :(得分:1)
我认为值得考虑的是,只需对标准库的一个API调用就可以获取所需的信息...
new Date().toLocaleString( 'sv', { timeZoneName: 'short' } );
// produces "2019-10-30 15:33:47 GMT−4"
如果要添加'T'分隔符,删除'GMT-'或在末尾附加':00',则必须进行文本交换。
但是,例如,您可以轻松地玩the other options。使用12h时间或忽略秒等。
请注意,我使用瑞典作为区域设置,因为它是使用ISO 8601格式的国家之一。我认为大多数ISO国家/地区都将这种“ GMT-4”格式用于时区偏移,而加拿大使用时区缩写,例如加拿大。东部夏令时为“ EDT”。
您可以从更新的标准i18n函数“ Intl.DateTimeFormat()”获得相同的结果 但是您必须通过选项告诉它包括时间,否则它只会给出日期。
答案 4 :(得分:1)
不需要moment.js:这是一个完整的往返答案,来自
<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
答案 5 :(得分:1)
您可以使用一些简单的扩展方法来实现。下面的Date扩展方法仅返回ISO格式的时区组件,然后您可以为日期/时间部分定义另一个组件,并将它们组合为一个完整的date-time-offset字符串。
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
。
答案 6 :(得分:0)
我两个都在这里发送
我在日期时间上遇到了这个问题,所以我要做的是:
const moment = require('moment-timezone')
const date = moment.tz('America/Bogota').format()
然后将日期保存到db,以便能够通过某些查询进行比较。
要安装moment-timezone
npm i moment-timezone
答案 7 :(得分:0)
检查:
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'
答案 8 :(得分:0)
这是我为此使用的功能:
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();
};
答案 9 :(得分: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;
}
答案 10 :(得分:-1)
对于那些只想以YYYY-MM-DD格式在当地时区显示今天日期的人,我的答案是一个微小的变化。
让我清楚一点:
我的目标:在用户所在的时区中获得今天的日期,但格式为ISO8601(YYYY-MM-DD)
代码如下:
new Date().toLocaleDateString("sv") // "2020-02-23" //
之所以可行,是因为瑞典的语言环境使用ISO 8601格式。