假设您网站的用户输入了一个日期范围。
2009-1-1 to 2009-1-3
您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。
现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
假设您网站的用户输入了一个日期范围。
2009-1-1 to 2009-1-3
您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。
现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
当前回答
另一种转换为UTC并将其保留为日期对象的解决方案:(它的工作方式是从格式化字符串的末尾删除“GMT”部分,然后将其放回Date构造函数中)
var now=新日期();var now_utc=新日期(now.toUTCString().slice(0,-4));控制台日志(now_utc)
我需要这样做来与日期时间选择器库交互。但总的来说,这样处理约会是个坏主意。
用户通常希望使用本地时间的日期时间,因此您可以更新服务器端代码以正确解析带有偏移量的日期时间字符串,然后转换为UTC(最佳选项),或者在发送到服务器之前转换为UTC字符串(如Will Stern的回答)
其他回答
getTimezoneOffset()方法返回时区差异,以分钟,从当前区域设置(主机系统设置)到UTC。
来源:MDN网络文档
这意味着,如果本地时区晚于UTC,则偏移量为正,如果超前,则偏移为负。例如,对于时区UTC+02:00,将返回-120。
let d=新日期();console.log(d);d.setTime(d.getTime()+(d.getTimezoneOffset()*60000));console.log(d);
注意:这会将日期对象时间转换为UTC±00:00,而不会转换其时区,因此日期对象时区仍然相同,但值将为UTC±0:00。
如果你经常与日期打交道,那么使用moment.js是值得的(http://momentjs.com). 转换为UTC的方法为:
moment(yourTime).utc()
您可以使用格式将日期更改为所需的任何格式:
moment(yourTime).utc().format("YYYY-MM-DD")
当前也有偏移选项,但有一个额外的补充库用于处理时区(http://momentjs.com/timezone/). 时间转换如下所示:
moment.tz(yourUTCTime, "America/New_York")
Date.prototype.toUTCArray= function(){
var D= this;
return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
D.getUTCMinutes(), D.getUTCSeconds()];
}
Date.prototype.toISO= function(){
var tem, A= this.toUTCArray(), i= 0;
A[1]+= 1;
while(i++<7){
tem= A[i];
if(tem<10) A[i]= '0'+tem;
}
return A.splice(0, 3).join('-')+'T'+A.join(':');
}
您可以使用以下方法将任何js日期转换为UTC:
let date = new Date(YOUR_DATE).toISOString()
// It would give the date in format "2020-06-16T12:30:00.000Z" where Part before T is date in YYYY-MM-DD format, part after T is time in format HH:MM:SS and Z stands for UTC - Zero hour offset
到目前为止,我发现获取GMT时间的最佳方法是首先获取您的本地日期时间。然后转换为GMT字符串。然后使用该字符串通过删除时区来构建新时间。
let dtLocal = new Date()
let dt = new Date(dtLocal.toISOString().split('Z')[0])
注意:-它将以GMT创建新的日期时间。但它将是本地日期时间,因为时区将附加到它。