2 回答
TA贡献1875条经验 获得超5个赞
时间戳(带时区)
据我所知,数据库中的日期时间以UTC为单位,但是当您检索它时,您(错误地)收到2017-02-09T16:38:58.000 + 02:00。
首先,如果可以的话,将MySQL数据库列的数据类型更改为(在其他一些数据库中,它将被称为 )。这将确保MySQL知道时间是UTC,并且应该使您能够将它们检索为正确的时间点,而不是在错误的时区中检索正确的时间。这反过来又将为您提供转换为客户端时区的最佳起点。timestamptimestamp with time zone
java.time
其次,从 java.time(现代 Java 日期和时间 API)中检索您的值到适当的类型中。避免,因为它设计不佳,无法处理不同的时区。例如,如果数据库数据类型为 :java.util.Datedatetime
LocalDateTime dateTime = yourResultSet.getObject("your_col", LocalDateTime.class);
LocalDateTime是一天中没有时区的日期和时间,因此您不能获得错误的时区。提供您知道正确的偏移量:
OffsetDateTime odt = dateTime.atOffset(ZoneOffset.UTC);
转换为客户端时区:
ZoneId clientTimeZone = ZoneId.of("Indian/Reunion");
ZonedDateTime clientDateTime = odt.atZoneSameInstant(clientTimeZone);
System.out.println(clientDateTime);
2017-02-09T20:38:58+04:00[印度/留尼汪]
在区域/城市格式中使用实时时区,而不是像 .它更容易理解,更面向未来。印度/留尼汪岛只是一个例子,当然,为您的客户使用正确的一个。+04:00
上面有偏移量和时区。建议保持这种方式,我不认为它有任何危害。客户端始终可以选择不显示它。如果您仍然坚持,请再次转换为:ZonedDateTimeLocalDateTime
LocalDateTime clientDateTimeWithoutOffset = clientDateTime.toLocalDateTime();
System.out.println(clientDateTimeWithoutOffset);
2017-02-09T10:38:58
如果数据库数据类型为时间戳:
OffsetDateTime odt = yourResultSet.getObject("your_col", OffsetDateTime.class);
这样就节省了上面的第一步。其余的是相同的。
TA贡献2016条经验 获得超9个赞
java.util.Date 不存储任何时区。它只是存储自“epoch”(即 1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。
因此,您所要做的就是知道服务器计算机的时区,找到此时区与要将其转换为的时区之间的时间段,然后添加或减去该时间段。
更新:
int clientGMT = 4; //GMT you want to convert to
int serverGMT = 2; //server's GMT
int delta = clientGMT - serverGMT; //delta between the dates
//assume this is the date in GMT + 2 received from the server
Date d1 = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss").parse("12.03.2019 13:00:00");
//... and you want to convert it to GMT + 4 (client side's time zone)
Date resultDate = new Date(d1.getTime() + delta * 3600000);
附言是的,您必须手动操作时区,正如我上面所说,不会存储此信息(每个日期都假定为UTC)。java.util.Date
添加回答
举报