与 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 日期对象