当我创建javascript
日期然后stringify
并将其发送到服务器时,我会得到两个不同的日期。 stringified
日期总是落后一天。
所以目前我将javascript
日期增加1天,以便我在服务器上收到相同的日期。
我目前的代码:
var dt = $(.datepicker).datepicker('getDate');//Fri Aug 26 2016 00:00:00 GMT+0200 (South Africa Standard Time)
var result = Json.stringify(dt); //"2016-08-25T22:00:00.000Z"
这是正确的做法还是我错过了什么?
答案 0 :(得分:5)
这是由于Date
中的时区组件。我做的工作是:
var date = $(.datepicker).datepicker('getDate');
var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes()))
var result = Json.stringify(utcDate);
删除时区组件。
答案 1 :(得分:1)
您似乎并不了解您的两个日期时间实际上是相同且正确的。您还没有解释为什么您认为需要手动更改发送到服务器的那个。这是一个示例,它表明它们实际上是相同的,只是在不同的timezones中以不同的格式显示。
// Values from the local datetime string
var local = {
year: 2016,
month: 7,
day: 26,
hours: 0,
minutes: 0,
seconds: 0,
milliseconds: 0
};
// Values from the UTC ISO 8601 datetime string
var utc = {
year: 2016,
month: 7,
day: 25,
hours: 22,
minutes: 0,
seconds: 0,
milliseconds: 0
};
// Create Date object as local
var date1 = new Date(
local.year,
local.month,
local.day,
local.hours,
local.minutes,
local.seconds,
local.milliseconds
);
// Create Date object as local from UTC
var date2 = new Date(Date.UTC(
utc.year,
utc.month,
utc.day,
utc.hours,
utc.minutes,
utc.seconds,
utc.milliseconds
));
var pre = document.getElementById('out');
// Display Date1 as local
pre.appendChild(document.createTextNode(date1.toString() + '\n'));
// Display Date2 as local
pre.appendChild(document.createTextNode(date2.toString() + '\n'));
// Display Date2 as UTC
pre.appendChild(document.createTextNode(date2.toUTCString() + '\n'));
// Test if Date1 and Date2 display the same datetime
pre.appendChild(document.createTextNode(
'Date1 === Date2: ' + (date1.getTime() === date2.getTime())
));

<pre id="out"></pre>
&#13;
JSON将Date对象转换为ISO 8601(按规范),但是如果您使用所选的解决方案,请看看会发生什么。
// Values from the local datetime string
var local = {
year: 2016,
month: 7,
day: 26,
hours: 0,
minutes: 0,
seconds: 0,
milliseconds: 0
};
// Create Date object as local
var date = new Date(
local.year,
local.month,
local.day,
local.hours,
local.minutes,
local.seconds,
local.milliseconds
);
// Your solution
var utcDate = new Date(Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes()));
var pre = document.getElementById('out');
// Display Date as local format
pre.appendChild(document.createTextNode(date.toString() + '\n'));
// Display utcDate as local format
pre.appendChild(document.createTextNode(utcDate.toString() + '\n'));
// Test if Date and utcDate display the same datetime
pre.appendChild(document.createTextNode(
'Date1 === Date2: ' + (date.getTime() === utcDate.getTime())
));
&#13;
<pre id="out"></pre>
&#13;
您最终会得到两个不再相同的日期。不喜欢ISO 8601传输和存储日期时间?那么替代方案是使用自纪元(UTC)以来的毫秒数getTime。您不能使JSON执行此转换而不是ISO 8601,甚至不使用替换器功能。因此,在使用JSON.stringify之前,必须进行任何转换。所以你真的需要解释你想要达到的目标,以及为什么你认为你现在所拥有的是不正确的。
答案 2 :(得分:0)
使用此
var result = Json.stringify(dt.toISOString());