Javascript 新日期(“GMT”)添加GMT小时数
输出:2017年4月10日星期一05:00:00 GMT+0800(+08)Javascript 新日期(“GMT”)添加GMT小时数,javascript,date,Javascript,Date,输出:2017年4月10日星期一05:00:00 GMT+0800(+08) 假设是:2017年4月9日星期日21:00:00 GMT+0800(+08)这很容易。您可以尝试以下方法: var开始=新日期(“2017-04-09T21:00:00”); start.setTime(start.getTime()+start.getTimezoneOffset()*60*1000); console.log(启动)有一条黄金法则,您永远不应该使用日期构造函数解析字符串(或Date.parse,它
假设是:2017年4月9日星期日21:00:00 GMT+0800(+08)这很容易。您可以尝试以下方法:
var开始=新日期(“2017-04-09T21:00:00”);
start.setTime(start.getTime()+start.getTimezoneOffset()*60*1000);
console.log(启动)代码>有一条黄金法则,您永远不应该使用日期构造函数解析字符串(或Date.parse,它们在解析时是等效的)
根据,不带时区的ISO 8601格式日期应视为本地日期:
当时区偏移不存在时,只解释日期形式
作为UTC标准,时间和日期格式被解释为本地时间
因此新日期(“2017-04-09T21:00:00”)
应返回主机时区2017年4月9日晚上9:00的日期
然而,在Safari 10和Chrome 57中的测试表明,“2017-04-09T21:00:00”被视为Z或GMT+0000。Firefox49似乎奇怪地将其视为UTC,然后以错误的方式调整本地时区。然而,Firefox38正确地将其视为本地的
所以总是手动解析字符串。使用库或编写短函数,例如
//将2017-04-09T11:00:00.000解析为本地
函数parseISOLocal(s){
var b=s.split(/\D/);
返回新日期(b[0],b[1]-1,b[2],(b[3]| 0),
(b[4]| | 0)、(b[5]| | 0)、(b[6]| | 0));
}
var s='2017-04-09T21:00:00.000';
log('内置解析器:'+新日期.toString());
log('parseISOLocal:'+parseISOLocal.toString())代码>远程T
来自“2017-04-09T21:00:00”
但我使用的是FullCalendar,它在使用T
输入日期时工作正常。那么start.toutString()呢@Smit从FullCalendar
传递到Date
constructor@gurvinder372-这将使它不是ISO 8601字符串,然后解析将依赖于实现。Safari将返回无效的日期。除了新日期(“2017-04-09T21:00:00”)
在不同的浏览器中返回不同的结果。对我来说,在Firefox49中,上面返回的是“2017-04-09T01:00:00.000Z”。在Safari中返回“2017-04-09T11:00:00.000Z”。根据ECMA-262,它应该被视为本地时间,因此不需要调整本地时区。在firefox中,当您将参数传递给Date()构造函数时,它被视为本地时间并返回格林威治标准时间。但是,在chrome中,该参数被视为格林威治平均时间并返回本地时间。因此,您需要检测浏览器并据此计算时间(输出)。但我不明白为什么Safari会返回意想不到的结果。如果你走上浏览器嗅探的道路,你会陷入痛苦的世界。只需手动解析字符串。
var start = new Date("2017-04-09T21:00:00");