假设您网站的用户输入了一个日期范围。

2009-1-1 to 2009-1-3

您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。

现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?


当前回答

看看你的问题,很明显,你只想将日期范围发送到后端进行进一步的后期处理。

我假设您符合标准数据指南,该指南要求数据采用特定格式。例如,我使用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/在那里我得到了灵感。

希望这有帮助!

其他回答

这是我的方法:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

生成的utc对象实际上不是utc日期,而是转换为与utc时间匹配的本地日期(请参见注释)。然而,在实践中,它确实起到了作用。


更新:当调用UTC.toString()、UTC.toLocaleString()等时,这个答案是获取UTC日期的一种快速而肮脏的方法。不过,有更好的解决方案,尤其是现在使用现代浏览器的情况下,我应该改进一下答案。基本上,.toISOString()(IE 9+)是您想要使用的。

到目前为止,我发现获取GMT时间的最佳方法是首先获取您的本地日期时间。然后转换为GMT字符串。然后使用该字符串通过删除时区来构建新时间。

let dtLocal = new Date()
let dt = new Date(dtLocal.toISOString().split('Z')[0])

注意:-它将以GMT创建新的日期时间。但它将是本地日期时间,因为时区将附加到它。

该方法将为您提供:2017-08-04T11:15:00.000+04:30,您可以忽略区域变量,只需获得2017-08-04T1 1:15:00.000。

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

甚至更简单

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

另一种转换为UTC并将其保留为日期对象的解决方案:(它的工作方式是从格式化字符串的末尾删除“GMT”部分,然后将其放回Date构造函数中)

var now=新日期();var now_utc=新日期(now.toUTCString().slice(0,-4));控制台日志(now_utc)

我需要这样做来与日期时间选择器库交互。但总的来说,这样处理约会是个坏主意。

用户通常希望使用本地时间的日期时间,因此您可以更新服务器端代码以正确解析带有偏移量的日期时间字符串,然后转换为UTC(最佳选项),或者在发送到服务器之前转换为UTC字符串(如Will Stern的回答)