长城日期处理...让客户端尊重服务器的时区



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

根据安德烈的一些暗示和一些严重的血汗和眼泪,我自己想通了。 我已经更新了Github中的代码,所以如果你好奇,请去看看那里。

基础知识:

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

相关内容

  • 没有找到相关文章

最新更新