当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring scheduler在每个时区的凌晨0点执行一些工作?

冯枫涟
2023-03-14

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

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

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

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

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

我们有一个国家表,我可以使用国家代码获取资本UTCzoneId,如下所示:

CN-


共有2个答案

吴德辉
2023-03-14

我认为,如果你创建几个触发器,并根据你需要的时区列表将它们设置为你需要执行任务的时间,你会得到更好的服务。

尤其是当工作取决于任务的时区时。

    List<Integer> timezoneDelays = Arrays.asList(1, 2, 5);
    for (double d : timezoneDelays){
        CronTrigger cronTrigger = new CronTrigger("0 0 " + d + " * * ?");
        taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
    }

http://www.baeldung.com/spring-task-scheduler

此外,简单地将任务设置为每小时或半小时启动一次也可能对您有用。

楚岳
2023-03-14

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

  • 一个国家可以有多个时区,每个时区的偏移量不同。例如,美国有4个时区(太平洋时间、山区时间、中部时间和东部时间——实际上,由于阿拉斯加和夏威夷的原因,美国的时区更多),俄罗斯有10多个,等等。即使是同一个州也可以有多个时区(如亚利桑那州)

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

理想的方法是使用IANA的时区名称,格式为大陆/地区(如America/New_YorkAsia/Shanghai),并使用一个可以处理DST问题并自动为您计算正确偏移量的API。对于拥有一个以上时区的国家,您必须任意选择一个IANA名称,基于一些标准(例如:在美国,我应该使用America/New_YorkAmerica/芝加哥America/Los_Angeles吗?由您决定)。

我还建议您使用Java 8 datetime API(如果可用)(对于较低版本,建议使用Three-Ten 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)信息,以便将作业配置为恰好在该时刻运行。

 类似资料:
  • 本文向大家介绍python 定时器,实现每天凌晨3点执行的方法,包括了python 定时器,实现每天凌晨3点执行的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python 定时器,实现每天凌晨3点执行的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 除了凌晨3点,是否有可能每隔15分钟(每小时等等)运行一次cronjob? 我还有一个特殊的cronjob,我想在凌晨3点运行,但是我不希望其他人同时运行… 问题答案: 有一条cron线,没有。有三个,是的:

  • 下午好. 抱歉我把你弄糊涂了。如果有任何问题请告诉我。有人帮忙吗? 谢谢。 维斯瓦 --1小时:30分钟--所以从1:00到1:59:59的任何值都是第二个实例值,且时区为MST。

  • 本文向大家介绍python 获取当天凌晨零点的时间戳方法,包括了python 获取当天凌晨零点的时间戳方法的使用技巧和注意事项,需要的朋友参考一下 最近写python,遇到了一个问题,需要获取当日凌晨零点的时间戳,网上实在没有找到,自己手写了一个,有点挫 输出如下: 1518105600 Fri Feb 9 00:00:00 2018 1518105600 以上这篇python 获取当天凌晨零点的

  • 本文向大家介绍Python 时间戳之获取整点凌晨时间戳的操作方法,包括了Python 时间戳之获取整点凌晨时间戳的操作方法的使用技巧和注意事项,需要的朋友参考一下 Python时间戳操作很多,每次用点时候总是去查,查的麻烦,现在自己也好好归纳一下。 我现在刚好有个需求需要获取当天零点时间戳,但是网上查的大部分都是用时间戳相减,或者用时区的方式,总感觉不是很好,我就自己写了一个。 获取凌晨时间  

  • 我试图设置一个作业在一个用户使用Quartz的时区的特定时间的单一执行。现在,开箱即用,告诉调度器执行时区中的任何内容的唯一方法是通过。对于Coors,我可能会将datetime转换为cron表达式,然后在第一次成功执行后立即停止触发器,但这有点难闻。 谢谢,