gpt4 book ai didi

java - 如何使用 Spring 调度程序在每个时区的凌晨 0 点做一些工作?

转载 作者:行者123 更新时间:2023-12-02 11:26:55 25 4
gpt4 key购买 nike

就像标题一样,有些任务需要在每个时区的凌晨 0 点执行,但是 @Scheduled 注解只支持设置一个时区,如下所示:

@Scheduled(cron = "0 0 0 * * ?", zone = "Asia/Shanghai")
public void scheduleTask() {...}

我只能在“亚洲/上海”凌晨0点做任务,如何在每个时区执行这个任务? Spring 调度程序支持或任何其他工具可以帮助我吗?

<小时/>

抱歉,我可能没有描述清楚问题。

这是我们的任务场景。我们有一个任务要在每个月的第一天凌晨 0 点执行,但是每个国家的 UTC 不同,那么我如何在每个国家的凌晨 00 点执行这个任务?

我们有一个国家/地区表,我可以使用国家/地区代码来获取大写UTC zoneId,就像这样:

CN -> UTC+08:00

最佳答案

我只是想警告一下将国家/地区映射到偏移量的方法,主要是因为:

  • 一个国家/地区可以拥有 1 个以上时区,每个时区都有不同的偏移量。例如,美国有 4 个(太平洋时间、山地时间、中部时间和东部时间 - 实际上,由于阿拉斯加和夏威夷,它有更多),Russia has more than 10等。即使是同一个也可以有多个时区(例如 Arizona )
  • 同一个国家/地区,即使只有 1 个时区,也可以采用夏令时 (DST),因此全年会有 2 个不同的偏移量
  • 在某些国家/地区,夏令时从午夜开始,这意味着时钟向前跳动 1 小时,从 23:59 直接跳到凌晨 1 点 - 因此在夏令时过渡期间,这些时区不存在午夜
  • 政府可能随时更改夏令时规则,因此您不能假设偏移量始终相同。没有夏令时的国家可以决定开始使用夏令时(反之亦然),或者更改夏令时开始和/或结束的日期等

因此,将国家/地区映射到偏移量是一种非常简单且容易出错的方法。它可能适用于某些情况,但不能保证在所有国家/地区、所有月份、所有时间都有效。事实上,很多情况下它都会失败。

理想的方法是使用IANA's timezones names ,采用 Continent/Region 格式(例如 America/New_YorkAsia/Shanghai),并使用可以处理 DST 问题和自动为您计算正确的偏移量。对于拥有多个时区的国家/地区,您必须根据某些标准任意选择一个 IANA 名称(例如:在美国,我应该使用 America/New_YorkAmerica/Chicago美国/洛杉矶?由您决定)。

我还建议您使用Java 8 datetime API ,如果可用(或 threeten backport 对于较低版本)。此 API 为您处理时区和 DST 内容,您可以获得与每个时区午夜相对应的准确 UTC 时刻。

List<String> timezones = // timezones you want

// month that I care about (example: March 2018)
YearMonth yearMonth = YearMonth.of(2018, 3);
for (String zoneName : timezones) {
ZoneId zone = ZoneId.of(zoneName);
// get midnight at first day of month, in this timezone
ZonedDateTime utc = yearMonth
// 1st of month
.atDay(1)
// midnight at the timezone
.atStartOfDay(zone)
// convert to UTC
.withZoneSameInstant(ZoneOffset.UTC);

// get the fields you need to configure the job
utc.getDayOfMonth();
utc.getHour();
... etc
}

使用此代码,变量 utc 将相当于每个时区的午夜(或当天的第一时刻,例如 DST 在午夜开始),但已转换为 UTC 的值。您可以获取日、月、年、小时、分钟以及您想要的任何内容(以 UTC 为单位),以将您的作业配置为在该时刻准确运行。

关于java - 如何使用 Spring 调度程序在每个时区的凌晨 0 点做一些工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551882/

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