假设您网站的用户输入了一个日期范围。
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对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
当前回答
您可以使用以下方法将任何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
其他回答
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
甚至更简单
myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
简单又愚蠢
var date=新日期();var now_utc=日期utc(Date.getUTCFullYear(),Date.getUTCMonth(),date.getUTCDate(),date.getUTPours(),date.getUTCMinutes(),date.getUTCSeconds());console.log(新日期(now_utc));console.log(date.toISOString());
你想把日期转换成这样的字符串吗?
我会制作一个函数来实现这一点,尽管有点争议,但还是将其添加到Date原型中。如果你不习惯这样做,那么你可以把它作为一个独立的函数,把日期作为一个参数传递。
Date.prototype.getISOString = function() {
var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
if (temp >= 0) zone += "+";
zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;
// "2009-6-4T14:7:32+10:00"
return this.getFullYear() // 2009
+ "-"
+ (this.getMonth() + 1) // 6
+ "-"
+ this.getDate() // 4
+ "T"
+ this.getHours() // 14
+ ":"
+ this.getMinutes() // 7
+ ":"
+ this.getSeconds() // 32
+ zone.substr(0, 3) // +10
+ ":"
+ String(temp).substr(-2) // 00
;
};
如果您在UTC时间需要它,只需使用getUTC*替换所有get*函数,例如:getUTCFullYear、getUTCMonth、getUTCHours。。。然后在末尾添加“+00:00”而不是用户的时区偏移。
浏览器可能会有所不同,你也应该记住不要相信客户端生成的任何信息,也就是说,下面的声明适用于我(Mac OS X 10.8.2上的Google Chrome v24)
var utcDate=新日期(new Date().getTime());
edit:“这和new Date()有什么不同?”请参见此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
如果未提供任何参数,则构造函数将根据系统设置为当前日期和时间创建JavaScript Date对象。注意:当Date作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要UTC,请使用具有相同参数的新日期(Date.UTC(…))。(注意:Date.UTC()返回自1970-01-01 00:00:00 UTC以来的毫秒数)
如前面的答案所述,添加60000*Date.getTimezoneOffset()是不正确的。首先,您必须将所有日期/时间视为UTC,并使用时区修饰符进行显示。
同样,浏览器可能有所不同,然而,Date.getTime()返回自1970-01-01 UTC/GMT以来的毫秒数。如果您像我上面所做的那样使用这个数字创建一个新的日期,它将是UTC/GMT。但是,如果通过调用.toString()来显示它,它将显示在本地时区中,因为.toString()使用的是本地时区,而不是调用它的Date对象的时区。
我还发现,如果您在日期上调用.getTimezoneOffset(),它将返回您的本地时区,而不是您调用它的日期对象的时区(但我无法验证这是否是标准的)。
在我的浏览器中,添加60000*Date.getTimezoneOffset()将创建一个不是UTC的DateTime。然而,当在我的浏览器中显示(例如:.toString())时,它会在我的本地时区中显示一个DateTime,如果忽略时区信息,该DateTime将是正确的UTC时间。