根据夏令时转换存储在数据库中的时间

Posted

技术标签:

【中文标题】根据夏令时转换存储在数据库中的时间【英文标题】: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 无关。

【问题讨论】:

你想要哪个时区? ZoneId.systemDefault() 的返回值是否同意? A Minimal, Reproducible Example 会有所帮助。 【参考方案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)。它存储当地时间对吗?

以上是关于根据夏令时转换存储在数据库中的时间的主要内容,如果未能解决你的问题,请参考以下文章

从 UTC 转换为本地时,夏令时在 TimeZoneInfo 中不起作用

将某人的当地时间转换为 UTC 时间

WordPress 从哪里获得夏令时信息

没有时区的时间戳中的夏令时时间偏移

存储在 SQL Server DB 中的 DateTime 不考虑夏令时。当我把它拉出来时,我该如何解决这个问题?

如何在android中检测夏令时转换