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

2009-1-1 to 2009-1-3

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

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

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

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


当前回答

如果需要日期对象

仅传递日期字符串date假定时间按时区偏移00:00:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

如果您添加当前的小时和分钟,您将获得正确的日期:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

其他回答

如果您的日期上有时区,则可以使用date fns tz:

import { zonedTimeToUtc } from 'date-fns-tz';

const dateBrazil = new Date() // I'm in Brazil, you should have or get the user timezone.
const dateUtc = zonedTimeToUtc(dateBrazil, 'America/Sao_Paulo')

这是我的方法:

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

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


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

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

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时期的毫秒)传递给服务器。

简单又愚蠢

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 = '2012-07-28'; stringdate = new Date(date).toISOString();

应该可以在大多数更新的浏览器中工作。在Firefox 6.0上返回2012-07-28T00:00:00.000Z