我在这里读了很多帖子:GWT日期处理。
特别是与我打成一线的是这一个
Sending a date and timezone from GAE server to GWT client
无论如何,我正在努力的项目需要能够将天,小时,分钟间隔显示为网格中的标签。我的团队采用了一种方法,所有日期/时间实例都以ISO8601字符串格式从服务器传递给客户端。客户端应遵守服务器时区。商业用例是所有日期/时间实例都处于“市场时间”,因此访问该应用程序的任何浏览器都将在“市场时间”时区中看到并使用日期,该时区恰好是GMT-05:00(如果夏令时有效)或GMT-06:00(如果标准时间有效)。
我在Github上发布了一些来源,在这里:
https://github.com/fastnsilver/gwt-datehandling-example
...特别
和GWTTestCase
希望有人能够盯着我们用于日期处理的公用事业(和测试)并帮助我们看到我们没有看到的东西。
修改
基本问题是“生产模式”中没有为“过渡日”正确计算CSTimeUtil#hoursInDay(Date)
此方法由其他方法使用(例如CSTimeUtil#dateToHour(Date)
和CSTimeUtil#labelsForDay(Date)
)。
我已经使用CSTimeUtil
的当前实现部署了我们的应用程序,它似乎可以工作,但并不完全。例如,mvn gwt:test
在GWT模式或Windows上的生产模式下运行,其中操作系统时区设置为除美国GMT-05:00
或GMT-06:00
以外的各种时区,我真的对备用测试结果感到困惑。
答案 0 :(得分:5)
基于安德烈的一些暗示和一些严肃的血,汗和泪,我自己想出来了。我已经更新了Github中的代码,所以如果你很好奇,那就去看看吧。
基础知识:
DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")
与format
和parse
日期java.util.Date
在“市场时间”中从DateTimeFormat(Date, TimeZone)
检索GMT前缀时区信息,其中TimeZone
param设置为TimeZone.createTimeZone(TZ_CONSTANTS_INSTANCE.americaChicago())
,时区字符串检索{ {1}} TimeZone.getISOTimeZoneString(Date)
或小时generateDay(Date, int)
,从源日期开始,必须考虑增加或减少coudl会触发时区偏移的变化,如果发生在“过渡日” 答案 1 :(得分:3)
如果时区已修复,为什么要使用字符串来表示日期/时间?您可以将标准Java Date对象发送到客户端。如果需要,您甚至可以将所有日期和时间存储为Longs并仅传递Longs。您还可以为您的时区发送GWT的TimeZone Json字符串(每个会话一次)。您可以在GWT中找到它 - 有一个包含所有时区字符串的文件。
在客户端上,您使用具有许多预定义格式的DateTimeFormat来显示您需要的任何内容:完整日期,月份和日期,日期和时间等。只需记住从此Json字符串创建TimeZone对象并在DateTimeFormat.getFormat中使用它( ...)。format(Date,TimeZone)。
使用这种方法,您不必担心DST更改(它们在Json字符串中编码)和区域设置。您只传递简单的Date或Long对象。