【发布时间】:2015-06-10 09:37:08
【问题描述】:
我正在使用 Grails 2.4 和 Ajax。在客户端,我构建 JSON 数据如下:
var data = {
// ... not important
date: new Date(
parseInt($("#date_year").val()),
parseInt($("#date_month").val()) - 1,
parseInt($("#date_day").val())),
// ...
};
我用 jQuery Ajax 发送日期:
$.ajax({
url: '${createLink(controller: 'report', action: 'save')}',
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
success: function (respondData, textStatus, jqXHR) {
alert('Saved succesfully');
},
error: function(jqXHR, textStatus, errorThrown) {
alert('NOT SAVED!!!');
}
});
在报表控制器ReportController 我有操作save(ThreatReport report)。通过某种魔法,Grails 能够将 JSON 数据解组到由 ThreatReport report 参数表示的 Groovy 模型(如果有人会指出一些关于如何配置的文档,我将非常感激)。
ThreatReport 类有一个 Date 属性(和其他属性,但它们工作正常)。然而,Grails 似乎在转换这个日期时遇到了麻烦。在 JavaScript 中我得到了
Wed Jun 10 2015 00:00:00 GMT+0200 (Central Europe Daylight Time)
然而,在 Groovy 控制器中,它突然回到了一天:
Tue Jun 09 00:00:00 CEST 2015
正如我所说,其余属性已正确转换。
【问题讨论】:
-
我不推荐使用 JavaScripts
toString()来序列化日期。我会使用momentjs之类的东西来格式化日期字符串并使用相同的格式模式对其进行反序列化。 -
你是指
JSON.stringify(data)吗? -
不是真的 - 在你的数据中我会做
var data {... 'date': date.getTime()}并将其转换回时间 (new Date(jsonDateValue)) -
我不认为我理解你。我有三个数字,一年,一个月和一天。从这些数字中,我创建了一个日期,如上所示。所以你的意思是我应该像我一样创建日期,然后使用
date.getTime()并使用new Date(jsonDateValue)将其重新转换回来?这对它有什么帮助?当我使用帮助打印时,date中的日期是正确的。 jQuery 发送正确的日期。只有 Groovy 对象包含早于一天的日期。 -
目前我使用了一种解决方法——我故意在将它发送到服务器之前增加一天(例如,当我想要 10/6 月时,我发送 11/6 月),但这看起来真的很笨拙和丑陋的。更不用说我不知道它是否适用于所有情况。