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

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 myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

处理日期时,我的建议是将日期解析为用户输入的各个字段。你可以把它当作一根完整的绳子,但你在玩火。

JavaScript可以以不同的格式处理两个相同的日期。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

永远不要做类似的事情:

new Date('date as text');

一旦您将日期从用户输入解析到其各个字段中,就创建一个日期对象。创建日期对象后,通过添加时区偏移将其转换为UTC。由于DST,我无法强调使用日期对象的偏移量有多重要(这是另一个讨论来说明原因)。

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

现在,您可以将日期以UTC时间传递给服务器。我再次强烈建议不要使用任何日期字符串。要么将其传递给服务器,并将其细分为所需的最低粒度,例如年、月、日、分钟,要么将其作为一个值(如unix时期的毫秒)传递给服务器。

对于目标是将其作为“日期对象”而不是字符串获取的其他人,并且您只想显示不带TZ(可能是硬编码的)的日期/时间,您可以做的是:

const now = new Date();
const year = now.getUTCFullYear();
const month = now.getUTCMonth();
const day = now.getUTCDate();
const hour = now.getUTCHours();

const tomorrowUTC= new Date();
tomorrowUTC.setDate(day + 1); // +1 because my logic is to get "tomorrow"
tomorrowUTC.setYear(year);
tomorrowUTC.setMonth(month);
tomorrowUTC.Hours(hour);

// then use the tomorrowUTC for to display/format it
// tomorrowUTC is a "Date" and not a string.

然后,您可以执行以下操作:

我们将在${格式(明天UTC,'EEEE do MMMM hh:mmaa')}UTC删除您的帐户

(格式是一个日期fns函数,如果需要,可以使用其他lib);

这有点“黑客”,因为这仍然使用本地时区,但如果你只想显示日期而不是时区,那么这就可以了。

如果你经常与日期打交道,那么使用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")

使用moment包,您可以轻松地将UTC的日期字符串转换为新的date对象:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

当您的服务器不支持时区,并且您希望将UTC日期始终存储在服务器中,并将其作为新的日期对象取回时,这特别有用。以上代码适用于我的需求,也适用于本线程的类似问题。在这里分享,这样可以帮助其他人。我在任何答案中都看不到上述解决方案。谢谢