GWT - 显示的时间比存储在DB中的时间晚1小时

时间:2016-03-26 06:00:33

标签: mysql gwt

当我在客户端显示时间时,它比存储在数据库上的时间晚一个小时(我只将时间存储在MySQL中作为时间类型)。我喜欢这个解决方案:

            Calendar myCalendar = new GregorianCalendar();
            int gmtOffset = myCalendar.get(Calendar.ZONE_OFFSET);
            int tzOffsetMin = (myCalendar.get(Calendar.ZONE_OFFSET) + myCalendar.get(Calendar.DST_OFFSET))/(1000*60);
            Window.alert("gmtOffset = " + gmtOffset + " tzOffsetMin = " + tzOffsetMin);

然而,当我编译它时,我收到错误:

[ERROR] Errors in 'file:/C:/Users/Glyndwr/workspace/AwardTracker_N/src/org/AwardTracker/client/HikeDetailsView.java'
      [ERROR] Line 525: No source code is available for type java.util.Calendar; did you forget to inherit a required module?
      [ERROR] Line 525: No source code is available for type java.util.GregorianCalendar; did you forget to inherit a required module?

我发现这是GWT的一个已知问题。

那么如何在GWT中找到偏移量,以便我可以考虑呢?如果我简单地减去一个小时,那么当我们从夏令时转为正常时,这是不正确的。

3 个答案:

答案 0 :(得分:1)

浏览器中的客户端TZ设置可能会影响它,以及服务器JVM的TZ。如果你希望Date在与数据库中完全相同的TZ中显示,请将它存储为字符串,以任何模式存储,让我们说'dd / MM / yyyy hh:mm:ss'会这样做。 然后在客户端使用DateTimeFormat对其进行反序列化。

这就是我们在遇到2个不同的转换(JVM,然后是客户端浏览器)和我们的日期时所做的事情。我希望它有所帮助。

答案 1 :(得分:0)

GWT编译器不支持java.util.Calendar类,这就是为什么你遇到上述错误。为了处理这样的日期,时间和时区问题,我建议您执行以下步骤

  1. 我建议您在数据库中使用TIMESTAMP或存储日期对象的时间(毫秒)。

  2. 从数据库中获取此值,通过rpc调用传递Date(或miliseconds time)值。

  3. 最后一步是使用DateTimeFormat格式化方法显示Date对象的时间部分,默认情况下会考虑客户端/浏览器时区并相应地显示值。

答案 2 :(得分:0)

您可以从TimeZone班级获取偏移信息。

TimeZone.createTimeZone(String tzJSON)

Fromt GWT文档:

  

应用程序可以从TimeZoneConstants类中获取这样的字符串,   或者它可以从服务器请求字符串。无论哪种方式,   应用程序从中提供的数据中获取原始字符串   TimeZoneConstant.properties文件,经过精心准备而成   CLDR和Olson时区数据库。

您通常不希望客户端上存在所有这些字符串。我使用RPC调用只检索我需要的字符串。

请注意,时区偏移在不同日期可能会有所不同。