我正在使用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!!!');
}
});
在报表 Controller
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 Controller 中,它突然又回来了:
Tue Jun 09 00:00:00 CEST 2015
如前所述,其余属性已正确转换。
最佳答案
我以前在Java中遇到过时区问题,您是否已经尝试将 -Duser.timezone 用作JVM启动的参数?
参见http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
例:
...java -Duser.timezone=Europe/London
或(不确定是否可行)
...java -Duser.timezone=Etc/GMT+2
更新
Java测试代码
Date date = new Date("2015/6/10");
System.out.println(date);
DateTime date2 = new DateTime(date.getTime(), DateTimeZone.UTC);
System.out.println(date2);
产生输出
Wed Jun 10 00:00:00 CEST 2015
2015-06-09T22:00:00.000Z
举例说明由于时区和/或DST问题引起的日间切换问题(在我的情况下,测试JVM使用正确的时区GMT + 2,因此我在第二个日期中使用了从第一个日期开始的时间戳来强制使用UTC)。
也许这不是您的特定问题,但是当您将正确的时区作为参数传递给 Web应用程序服务器的JVM时(例如,在tomcat启动脚本中,在IDE中为而不是),可能会有所帮助。如果您在欧洲的夏令时,请尝试例如“Etc / GMT + 2”。
这一定不是但可能是问题的根源,我不熟悉您使用的框架,但我知道时区和夏时制问题可能很复杂/令人困惑,因为这可能是自定义和默认设置(操作系统, JVM)以及框架如何处理有/无时间和/或时区的日期。
以防万一,请不要忘记为您的应用程序调整有关时区参数的其他系统上的JVM调用:-)
关于jquery - 在Grails日期中将JSON解码到Groovy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30752591/