为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2022-08-03 15:21:44
上下搜索,向右和向左 - 找不到这个问题的简单答案:我有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转换为纯日期,该日期有权转换为特定时区。听起来很简单?在阅读了非常多的文献之后,我已经不确定这是否非常简单。
查看完整描述

2 回答

?
慕田峪4524236

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);

这样就节省了上面的第一步。其余的是相同的。


查看完整回答
反对 回复 2022-08-03
?
慕沐林林

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


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信