我在这里阅读了很多帖子:GWT 日期处理。
一个特别让我心动的就是这个
Sending a date and timezone from GAE server to GWT client
无论如何,我正在从事的项目需要能够将天数、小时数、分钟间隔显示为网格中的标签。我的团队采用了一种方法,所有日期/时间实例都以 ISO8601 字符串格式从服务器传递给客户端。客户端要遵守服务器时区。 biz 用例是所有日期/时间实例都在“市场时间”,因此访问该应用程序的任何浏览器都将看到并使用“市场时间”时区中的日期,该时区恰好是 GMT-05:00(如果夏令时生效)或 GMT-06:00(如果标准时间生效)。
我在 Github 上发布了一些资源,在这里:
https://github.com/fastnsilver/gwt-datehandling-example
特别...
https://github.com/fastnsilver/gwt-datehandling-example/blob/master/src/main/java/me/fns/gwt/datehandling/client/util/CSTimeUtil.java
和 GWTTestCase
https://github.com/fastnsilver/gwt-datehandling-example/blob/master/src/test/java/me/fns/gwt/datehandling/client/util/CSTimeUtilTestGwt.java
希望有人可以盯着我们用于日期处理的实用程序(和测试),并帮助我们看到我们没有看到的东西。
编辑
基本问题是CSTimeUtil#hoursInDay(Date)
在“过渡日”的生产模式下未正确计算此方法由其他方法(如 CSTimeUtil#dateToHour(Date)
和 CSTimeUtil#labelsForDay(Date)
)使用。
我已经使用 CSTimeUtil
的当前实现部署了我们的应用程序它似乎有效,但不完全有效。我真的对替代测试结果感到困惑,例如,mvn gwt:test
在 Windows 上以 GWT 模式或生产模式运行,其中操作系统时区设置为美国以外的各种时区 GMT-05:00
或 GMT-06:00
.
最佳答案
根据安德烈的一些提示以及一些严重的血汗和泪水,我自己弄清楚了这一点。我已经更新了 Github 中的代码,所以如果你很好奇,请去那里看看。
基础知识:
DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")
至 format
和 parse
日期 java.util.Date
检索以 GMT 为前缀的时区信息在“市场时间”中使用 DateTimeFormat(Date, TimeZone)
,其中 TimeZone
参数设置为 TimeZone.createTimeZone(TZ_CONSTANTS_INSTANCE.americaChicago())
和时区字符串由 TimeZone.getISOTimeZoneString(Date)
检索到generateDay(Date, int)
或小时 generateHour(Date, int)
,从源日期必须考虑到如果发生在“过渡日”,增量或减量可能会触发时区偏移的变化。 关于GWT 日期处理...让客户端尊重服务器的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214624/