当我在客户端显示时间时,它比存储在数据库上的时间晚一个小时(我只将时间存储在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中找到偏移量,以便我可以考虑呢?如果我简单地减去一个小时,那么当我们从夏令时转为正常时,这是不正确的。
答案 0 :(得分:1)
浏览器中的客户端TZ设置可能会影响它,以及服务器JVM的TZ。如果你希望Date在与数据库中完全相同的TZ中显示,请将它存储为字符串,以任何模式存储,让我们说'dd / MM / yyyy hh:mm:ss'会这样做。 然后在客户端使用DateTimeFormat对其进行反序列化。
这就是我们在遇到2个不同的转换(JVM,然后是客户端浏览器)和我们的日期时所做的事情。我希望它有所帮助。
答案 1 :(得分:0)
GWT编译器不支持java.util.Calendar
类,这就是为什么你遇到上述错误。为了处理这样的日期,时间和时区问题,我建议您执行以下步骤
我建议您在数据库中使用TIMESTAMP或存储日期对象的时间(毫秒)。
从数据库中获取此值,通过rpc调用传递Date(或miliseconds time)值。
最后一步是使用DateTimeFormat格式化方法显示Date对象的时间部分,默认情况下会考虑客户端/浏览器时区并相应地显示值。
答案 2 :(得分:0)
您可以从TimeZone
班级获取偏移信息。
TimeZone.createTimeZone(String tzJSON)
Fromt GWT文档:
应用程序可以从TimeZoneConstants类中获取这样的字符串, 或者它可以从服务器请求字符串。无论哪种方式, 应用程序从中提供的数据中获取原始字符串 TimeZoneConstant.properties文件,经过精心准备而成 CLDR和Olson时区数据库。
您通常不希望客户端上存在所有这些字符串。我使用RPC调用只检索我需要的字符串。
请注意,时区偏移在不同日期可能会有所不同。