假设您网站的用户输入了一个日期范围。
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对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
当前回答
简单又愚蠢
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”而不是用户的时区偏移。
我刚刚发现Steven Levithan的date.format.js的1.2.3版本正是我想要的。它允许您为JavaScript日期提供格式字符串,并将从本地时间转换为UTC。下面是我现在使用的代码:
// JavaScript dates don't like hyphens!
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);
// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime');
浏览器可能会有所不同,你也应该记住不要相信客户端生成的任何信息,也就是说,下面的声明适用于我(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时间。
const event = new Date();
console.log(event.toUTCString());
看看你的问题,很明显,你只想将日期范围发送到后端进行进一步的后期处理。
我假设您符合标准数据指南,该指南要求数据采用特定格式。例如,我使用ODATA,这是一个RESTfull API,它期望日期时间对象的格式为:-
YYYY-MM-ddt0:00:00。
这可以通过下面的代码段轻松实现(请根据您的要求更改格式)。
var mydate//假设这是我要公开的约会对象var UTCDateStr=mydate.getUTCFullYear()+“-”+mydate.get-UTCMonth()+”-“+mydate.getUTCDate()+(T00:00:00);
另一方面,如果您处于我的情况,您从后端收到了一个日期,浏览器会将其转换为您的本地日期。另一方面,如果您对UTC日期感兴趣,则可以执行以下操作:-
var mydate//假设这是我要公开的约会对象var UTCDate=新日期(mydate)/*创建日期对象的副本。仅当您出于某种原因需要原始本地日期时才需要*/UTCDate.setTime(UTCDate.getTime()+UTCDate.getTimezoneOffset()*60*1000);
上面的代码片段基本上是根据时区添加/减去浏览器添加/减去的时间。
例如,如果我在美国东部时间(GMT-5),并且我的服务返回日期时间对象=2016年8月17日星期三00:00:00 GMT-0500我的浏览器会自动减去时区偏移(5hrs)以获得我的本地时间。因此,如果我尝试获取2016年8月16日星期三19:00:00 GMT-0500的时间。这会导致很多问题。那里有很多库,这肯定会让这变得更容易,但我想分享纯JS方法。
有关更多信息,请查看:http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/在那里我得到了灵感。
希望这有帮助!