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

2009-1-1 to 2009-1-3

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

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

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

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


当前回答

我发现jQuery全球化插件的日期解析工作得最好。其他方法存在跨浏览器问题,像date.js这样的东西已经很长时间没有更新了。

页面上也不需要datePicker。您可以调用与文档中给出的示例类似的内容:

$.parseDate('yy-mm-dd', '2007-01-26');

其他回答

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

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

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

我刚刚发现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'); 

我发现jQuery全球化插件的日期解析工作得最好。其他方法存在跨浏览器问题,像date.js这样的东西已经很长时间没有更新了。

页面上也不需要datePicker。您可以调用与文档中给出的示例类似的内容:

$.parseDate('yy-mm-dd', '2007-01-26');

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

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

转换为ISO而不更改日期/时间

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

转换为ISO并更改日期/时间(日期/时间将更改)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Fiddle链接