【问题标题】:Convert time stored in DB based on DST根据夏令时转换存储在数据库中的时间
【发布时间】:2020-03-15 06:13:13
【问题描述】:

我有时间存储在数据库中。

ID  TYPE        STARTTIME    ENDTIME

1   WEEKDAY     08:00:00    18:00:00
2   SATURDAY    10:00:00    16:00:00
3   SUNDAY      10:00:00    16:00:00
4   HOLIDAY     10:00:00    16:00:00

Java 代码:

ZonedDateTime.of(date, entity.getStartTime(), ZoneId.systemDefault());

这是在夏令时结束时检索开始时间为 09:00:00 和结束时间为 19:00:00。

根据夏令时检索这些时间的最佳方法是什么?

例子

对于工作日,我需要将开始时间设置为 08:00:00,将结束时间设置为 18:00:00,而与 DST 无关。

【问题讨论】:

标签: java calendar timezone dst java-time


【解决方案1】:

我知道这样做可能很奇怪,但您可以将其转换为 UTC,然后使用 withZoneSameLocal 将同一瞬间转换为另一个区域

此方法更改时区并保留本地日期时间。本地日期时间仅在对新区域无效时才会更改,使用与 ofLocal(LocalDateTime, ZoneId, ZoneOffset) 相同的方法确定。

ZonedDateTime dateTime = ZonedDateTime.of(LocalDate.now(),LocalTime.now() ,ZoneId.of("UTC"));

System.out.println(dateTime);  //2019-11-19T10:48:12.324356Z[UTC]

ZonedDateTime result = dateTime.withZoneSameLocal(ZoneId.of("America/Chicago"));  // provide ZoneId.systemDefault()

System.out.println(result);    //2019-11-19T10:48:12.324356-06:00[America/Chicago]

【讨论】:

  • 为什么我们需要进入 UTC 并转换为本地时区?为什么不 ZonedDateTime dateTime = ZonedDateTime.of(LocalDate.now(),LocalTime.now() ,ZoneId.systemDefault());
  • 您的数据库可能位于 UTC 时区,这是推荐的,并且当您使用系统默认时区将其转换回来时。如果您的时区有 dst @Deepak,它将考虑 dst
  • 我们对上面提到的 lat 2 列(STARTTIME 和 ENDTIME)使用 TIME 数据类型(MySql DB)。它存储当地时间对吗?
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2017-08-28
  • 2016-12-13
  • 1970-01-01
  • 2021-03-09
  • 2020-05-22
  • 2018-04-12
  • 2016-08-10
相关资源
最近更新 更多