与javascript日期相比,Json Stringify日期生成错误的日期

时间:2016-08-26 09:52:58

标签: javascript json stringify

当我创建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"

这是正确的做法还是我错过了什么?

3 个答案:

答案 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;
&#13;
&#13;

JSON将Date对象转换为ISO 8601(按规范),但是如果您使用所选的解决方案,请看看会发生什么。

&#13;
&#13;
// 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;
&#13;
&#13;

您最终会得到两个不再相同的日期。不喜欢ISO 8601传输和存储日期时间?那么替代方案是使用自纪元(UTC)以来的毫秒数getTime。您不能使JSON执行此转换而不是ISO 8601,甚至不使用替换器功能。因此,在使用JSON.stringify之前,必须进行任何转换。所以你真的需要解释你想要达到的目标,以及为什么你认为你现在所拥有的是不正确的。

答案 2 :(得分:0)

使用此

var result = Json.stringify(dt.toISOString());