客户端和服务器端 (GWT) 之间的日期更改
dates change between client and server side (GWT)
我有一个我无法理解的问题。我尝试了很多时间来寻找答案,但没有成功。
我使用 GWT 客户端,Java 服务器端。
客户端,我读取日期 (java.util.date)。当我将这些日期发送到服务器端时,有时我收到它时会有一个小时的偏移。
我知道 TimeZone 有很多问题。但我认为 TimeZone 不对我的问题负责,因为并非所有日期都是错误的。为了测试哪些日期是错误的,我创建了一个方法,该方法创建了 1900 年 1 月 1 日到今天之间所有日期的列表,并将该列表发送到服务器。
当我读取服务器收到的列表时,结果如下:
- 从 1995 年开始所有日期都是正确的(日期在发送过程中没有改变)
- 从 1979 年到 1995 年(大约):所有日期都是正确的,除了 9 月/10 月的 28 天(从夏令时到冬季夏令时)。由于偏移了一小时,所以不正确。
- 之前:有些日期是正确的,有些是不正确的。
所以我尝试在我的日期客户端添加 100 年,发送它并删除 100 年的服务器端。所有收到的日期都是正确的!
有人遇到过这个问题吗?有人理解这个问题吗?欢迎任何帮助。
谢谢!
编辑:
好的,我解决了问题。阅读 Andrei Volgin 的回答以了解问题。这是解决它的代码:
// 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 或使用偏移量创建时区,浏览器将不会意识到这些更改。因此,浏览器在显示时间时仅使用该时区的时区偏移量和当前 DST 设置。大多数情况下,这会产生正确的时间,但并非总是如此。这也解释了为什么所有未来的日期都是正确的。
为了获得准确的转换,您需要使用 GWT 提供的 JSON 数据字符串创建一个 TimeZone object,即使用 createTimeZone(java.lang.String tzJSON)
或 createTimeZone(TimeZoneInfo timezoneData)
。
我有一个我无法理解的问题。我尝试了很多时间来寻找答案,但没有成功。
我使用 GWT 客户端,Java 服务器端。
客户端,我读取日期 (java.util.date)。当我将这些日期发送到服务器端时,有时我收到它时会有一个小时的偏移。 我知道 TimeZone 有很多问题。但我认为 TimeZone 不对我的问题负责,因为并非所有日期都是错误的。为了测试哪些日期是错误的,我创建了一个方法,该方法创建了 1900 年 1 月 1 日到今天之间所有日期的列表,并将该列表发送到服务器。
当我读取服务器收到的列表时,结果如下:
- 从 1995 年开始所有日期都是正确的(日期在发送过程中没有改变)
- 从 1979 年到 1995 年(大约):所有日期都是正确的,除了 9 月/10 月的 28 天(从夏令时到冬季夏令时)。由于偏移了一小时,所以不正确。
- 之前:有些日期是正确的,有些是不正确的。
所以我尝试在我的日期客户端添加 100 年,发送它并删除 100 年的服务器端。所有收到的日期都是正确的!
有人遇到过这个问题吗?有人理解这个问题吗?欢迎任何帮助。
谢谢!
编辑:
好的,我解决了问题。阅读 Andrei Volgin 的回答以了解问题。这是解决它的代码:
// 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 或使用偏移量创建时区,浏览器将不会意识到这些更改。因此,浏览器在显示时间时仅使用该时区的时区偏移量和当前 DST 设置。大多数情况下,这会产生正确的时间,但并非总是如此。这也解释了为什么所有未来的日期都是正确的。
为了获得准确的转换,您需要使用 GWT 提供的 JSON 数据字符串创建一个 TimeZone object,即使用 createTimeZone(java.lang.String tzJSON)
或 createTimeZone(TimeZoneInfo timezoneData)
。