4

我在这里读过很多帖子: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操作系统时区设置为除 USGMT-05:00GMT-06:00.

4

2 回答 2

5

根据安德烈的一些提示和一些严重的血汗和泪水,我自己弄清楚了这一点。我已经更新了 Github 中的代码,所以如果你好奇,请去那里看看。

基础知识:

  • 确保从服务器发送到客户端时所有字符串都符合 ISO8601(无毫秒)标准,反之亦然
  • 使用 DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")formatparse日期
  • java.util.Date使用 检索“市场时间”中以 GMT 为前缀的时区信息DateTimeFormat(Date, TimeZone),其中TimeZone参数设置为TimeZone.createTimeZone(TZ_CONSTANTS_INSTANCE.americaChicago()),时区字符串由检索TimeZone.getISOTimeZoneString(Date)
  • 从源日期生成天数、seegenerateDay(Date, int)或 hoursgenerateHour(Date, int)必须考虑到如果发生在“过渡日”,增量或减量可能会触发时区偏移的变化。
于 2012-11-07T22:37:03.763 回答
3

如果您的时区是固定的,为什么要使用字符串来表示日期/时间?您可以将标准 Java Date 对象发送到客户端。如果需要,您甚至可以将所有日期和时间存储为 Long 并仅传递 Long。您还为您的时区发送 GWT 的 TimeZone Json 字符串(每个会话一次)。您可以在 GWT 中找到它 - 有一个包含所有时区字符串的文件。

在客户端上,您使用具有许多预定义格式的 DateTimeFormat 来显示您需要的任何内容:完整日期、月份和日期、日期和时间等。只要记住从这个 Json 字符串创建 TimeZone 对象并在 DateTimeFormat.getFormat(... ).format(日期,时区)。

使用这种方法,您不必担心 DST 更改(它们被编码在该 Json 字符串中)和语言环境。您只传递简单的 Date 或 Long 对象。

于 2012-11-04T03:33:11.640 回答