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

Posted

技术标签:

【中文标题】与 javascript 日期相比,Json Stringify 日期产生错误的日​​期【英文标题】:Json Stringify date produces a wrong date compared to javascript date 【发布时间】:2017-01-02 23:01:04 【问题描述】:

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

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

【问题讨论】:

dt的内容是什么,result的输出是什么? i increment my javascript date by 1 day - 这不是一个好方法 - 在 UTC 日期与您的一天相同的一天中的不同时间尝试它 - 然后查看已尝试克服这些问题的库。 .. 日期对于每种语言的每个程序员来说都是一种痛苦:p 请确认您的客户端和服务器在同一时区 @guy 我更新了问题, 您似乎不了解区域设置和 UTC 日期时间。 【参考方案1】:

使用这个

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

【讨论】:

isostring: YYYY-MM-DDTHH:mm:ss.sssZ 请编辑更多信息。不建议使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。【参考方案2】:

这是由于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);

删除时区组件。

【讨论】:

你最终会得到一个不准确的应用程序。 @Xotic750,您能解释一下原因并提出解决方案吗 您的问题中的日期时间格式是相同的日期时间,只是时区不同,一个是GMT+2,另一个是UTC。因此,您的服务器已经收到与您的客户端相同的日期时间。您需要解释为什么您认为或需要手动创建 2 个日期时间的差异.. 这将在 2022 年 1 月 1 日失败,它将返回 2021 年 1 月 1 日【参考方案3】:

您似乎不明白您的两个日期时间实际上是相同的并且是正确的。您还没有解释为什么您认为您需要手动更改发送到服务器的那个。这是一个例子,说明它们实际上是相同的,只是在不同的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>

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())
));
<pre id="out"></pre>

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

【讨论】:

以上是关于与 javascript 日期相比,Json Stringify 日期产生错误的日​​期的主要内容,如果未能解决你的问题,请参考以下文章

提取以“st”、“nd”、“rd”、“th”结尾的日期,同时使用 RegEx 将日期与月份交换

与直接存储日期相比,使用日期维度表有啥优势?

将 Json 日期字符串转换为 JavaScript 日期对象

20.2 解析与序列化JavaScript高级程序设计第三版

如何显示与当前日期相比的时差?

Python 和 JavaScript 之间的 JSON 日期时间