猿问

Java.util.date 获取客户端时区的实际日期

上下搜索,向右和向左 - 找不到这个问题的简单答案:

我有java.util.Date实例,它从mySQL获取其值。

此外,我有登录用户的时区代码。

我需要获取用户时区的实际时间。

例如:

我的服务器计算机时区是 GMT+2。

我在 DB 中的日期值为: 2017-02-09 16:38:58.000

根据我的服务器- 机器 - 时区,我将其放入日期实例为:2017-02-09T16:38:58.000 + 0200

现在我需要知道如果:

例如,我的客户端时区代码是GMT + 4,我想得到:

2017-02-09 20:38:58.000

纯日期,这与我的时区正好,不包含“+4”或“GMT”指示。

简而言之:将我的java.util.date转换为纯日期,该日期有权转换为特定时区。

听起来很简单?在阅读了非常多的文献之后,我已经不确定这是否非常简单。


猛跑小猪
浏览 160回答 2
2回答

慕田峪4524236

时间戳(带时区)据我所知,数据库中的日期时间以UTC为单位,但是当您检索它时,您(错误地)收到2017-02-09T16:38:58.000 + 02:00。首先,如果可以的话,将MySQL数据库列的数据类型更改为(在其他一些数据库中,它将被称为 )。这将确保MySQL知道时间是UTC,并且应该使您能够将它们检索为正确的时间点,而不是在错误的时区中检索正确的时间。这反过来又将为您提供转换为客户端时区的最佳起点。timestamptimestamp with time zonejava.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);这样就节省了上面的第一步。其余的是相同的。

慕沐林林

java.util.Date 不存储任何时区。它只是存储自“epoch”(即 1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。因此,您所要做的就是知道服务器计算机的时区,找到此时区与要将其转换为的时区之间的时间段,然后添加或减去该时间段。更新:int clientGMT = 4; //GMT you want to convert toint serverGMT = 2; //server's GMTint delta = clientGMT - serverGMT; //delta between the dates//assume this is the date in GMT + 2 received from the serverDate 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
随时随地看视频慕课网APP

相关分类

Java
我要回答