日期在客户端和服务器端(GWT)之间变化



我有一个无法理解的问题。我曾多次试图找到答案,但都没有成功。

我使用GWT客户端和Java服务器端。

在客户端,我读取日期(java.util.date)。当我将这些日期发送到服务器端时,有时收到日期时会有一个小时的偏移量。我知道时区有很多问题。但我认为时区不对我的问题负责,因为并非所有日期都是错误的。为了测试哪些日期是错误的,我创建了一个方法,该方法创建1900年1月1日至今天之间的所有日期的列表,并将该列表发送到服务器。

当我阅读服务器中收到的列表时,以下是结果:

  • 所有日期都是1995年的正确日期(发送期间日期没有更改)
  • 从1979年到1995年(大约):所有日期都是正确的,除了9月/10月的28天(从开关到冬季夏令时)。这是不正确的,因为偏移了一个小时
  • 之前:有些日期是正确的,有些日期不正确

所以我试图在我的约会客户端添加100年,发送它并删除100年服务器端。所有收到的日期都是正确的!

有人已经有这个问题了吗?有人理解这个问题吗?欢迎任何帮助。

谢谢!

编辑:

好的,我解决了问题。阅读安德烈·沃尔金的答案来理解问题。这是解决问题的代码:

// Create date you want
Date date = new Date()
// Get TimeZone of your date
TimeZone timeZone = TimeZone.createTimeZone(date.getTimezoneOffset());
// Adapt your date with the TimeZone
date.setTime(date.getTime() - (timeZone.getOffset(date) * 60000));
// You can send your date to server
// TimeZone server side is "UTC", and all dates received are correct

这是一个时区问题。

时区的定义,尤其是夏令时规则,多年来一直在变化。如果您只是简单地传递时区ID或使用偏移量创建时区,则浏览器不会意识到这些更改。因此,浏览器在显示时间时只需使用时区偏移和该时区的当前夏令时设置。大多数情况下,这会导致一个正确的时间,但并不总是如此。这也解释了为什么未来的所有日期都是正确的。

为了获得准确的转换,您需要使用GWT提供的JSON数据字符串创建一个TimeZone对象,即使用createTimeZone(java.lang.String tzJSON)createTimeZone(TimeZoneInfo timezoneData)

最新更新