GWT Date Handing ...拥有客户尊重服务器的时区

时间:2012-11-03 23:41:56

标签: gwt date timezone

我在这里读了很多帖子: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

...特别

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在GWT模式或Windows上的生产模式下运行,其中操作系统时区设置为除美国GMT-05:00GMT-06:00以外的各种时区,我真的对备用测试结果感到困惑。

2 个答案:

答案 0 :(得分:5)

基于安德烈的一些暗示和一些严肃的血,汗和泪,我自己想出来了。我已经更新了Github中的代码,所以如果你很好奇,那就去看看吧。

基础知识:

  • 确保从服务器发送到客户端时所有字符串都符合ISO8601(无毫秒),反之亦然
  • 使用DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")formatparse日期
  • 使用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对象。