gpt4 book ai didi

java - 支持跨时区和夏令时变化的重复事件

转载 作者:行者123 更新时间:2023-11-30 10:16:19 25 4
gpt4 key购买 nike

构建了一个基本系统,允许用户安排在某个日期/时间与 A、B、C 会面

我想全面检查我们的解决方案是否适用于 DST 更改。

两个关键类是:

  • User - 持有用户的 ZoneId 所以 Europe/Paris, Asia/Tokyo
  • Event - 保存预定事件的 LocalDateTime,例如。 2018-05-04T10:00:00.000 和创建事件时用户的 ZoneId,例如。 欧洲/巴黎

然后我们将事件粘贴到我们的调度程序中:

import org.springframework.scheduling.TaskScheduler;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;

public class MyScheduler {

private final TaskScheduler executor;

...

public void schedule(Event event) {
...
ZonedDateTime scheduledAt = ZonedDateTime.of(event.getScheduledAt(), event.getScheduledAtTimeZone());
if (scheduledAt.isAfter(ZonedDateTime.now(ZoneId.systemDefault()))) {
executor.schedule(task, Date.from(scheduledAt.toInstant()));
}
}
}

如果我是正确的,无论时钟是 UTC+1 还是 UTC+2,上述代码都应该在周五上午 10 点 Europe/Paris 开始事件。

上述方法看起来合理吗?

我还注意到 ZonedDateTime 类除了时间和时区之外还有一个偏移量,例如。 2018-05-02T20:46:03.002+01:00[欧洲/伦敦]。保留偏移量的唯一原因(我能想到的)是了解用户是否在夏令时期间创建了事件。

在这种情况下,我们的系统存储偏移量是否有任何好处,或者我们是否只使用本地事件时间和创建它的区域?

最佳答案

我能想到的唯一真正的问题是事件发生在秋季时钟向后移动时发生的极端情况,那么即使知道区域,LocalDateTime 也可能不明确。

Instant 通常推荐用于时区中性时间点,因此除非严格要求知道创建事件的时区,否则我会使用它。此外,即使 是一项要求,因为您仍然可以将 ZoneId 放在它旁边。它还会使您的代码更简单一些。另一个明智的选择是安排时间的 ZonedDateTime;它对我的吸引力较小。

关于java - 支持跨时区和夏令时变化的重复事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50142847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com