根据夏令时转换存储在数据库中的时间
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 中不起作用