我在这里读了很多帖子:GWT日期处理。
一个特别让我感到困惑的是这个
将日期和时间区域从 GAE 服务器发送到 GWT 客户端
无论如何,我正在从事的项目需要能够在网格中将天、小时、分钟间隔显示为标签。 我的团队采用了一种方法,其中所有日期/时间实例都以字符串格式从服务器传递客户端ISO8601。 客户端应遵循服务器时区。 商业用例是所有日期/时间实例都处于"市场时间",因此访问该应用程序的任何浏览器都将看到并使用"市场时间"时区中的日期,该时区恰好是 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中的代码,所以如果你好奇,请去看看那里。
基础知识:
- 确保所有字符串在从服务器发送到客户端时都符合ISO8601(无毫秒),反之亦然
- 使用
DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")
format
和parse
日期 - 使用
DateTimeFormat(Date, TimeZone)
从"市场时间"中的java.util.Date
中检索以GMT为前缀的时区信息,其中TimeZone
参数设置为TimeZone.createTimeZone(TZ_CONSTANTS_INSTANCE.americaChicago())
,时区字符串由TimeZone.getISOTimeZoneString(Date)
检索 - 从源日期生成天数(请参阅
generateDay(Date, int)
或小时generateHour(Date, int)
)必须考虑到,如果在"过渡日"发生,增量或减少可能会触发时区偏移量的变化。
如果您的时区是固定的,为什么要使用字符串来表示日期/时间?您可以将标准 Java Date 对象发送到客户端。如果需要,您甚至可以将所有日期和时间存储为长,并且仅传递长。您还可以发送您所在时区的 GWT 时区 Json 字符串(每个会话一次)。您可以在 GWT 中找到它 - 有一个包含所有时区字符串的文件。
在客户端上,您可以使用具有许多预定义格式的 DateTimeFormat 来显示您需要的任何内容:完整日期、月份和日期、日期和时间等。请记住从此 Json 字符串创建时区对象,并在 DateTimeFormat.getFormat(...) 中使用它。格式(日期,时区)。
使用此方法,您不必担心 DST 更改(它们在该 Json 字符串中编码)和区域设置。您只传递简单的 Date 或 Long 对象。