前言

在最近的使用中,感觉到这个apscheduler非常的好用,但是吧,一切美好的想象就停留在了部署的那天….

我本以为一切如我所愿,按照我预期的运行,于是我在开启了一个定时任务后,满怀期待的等待着,只要他执行,我就可以下班走人了,但是,时间到了之后,他还是没有执行,于是我就意识到,事情开始往我意想不到的方向发展了。

我在查看了redis之后,发现,他的任务还在,并没有报错,只是时间是在八小时之后,哎,我这才意识到是时区的问题。那,废话不多说,直接开始上代码。

解决方案

  1. 直接在添加任务处指定时区,如下:

    # 这样的话,就是utc时间了。
    schedudler.add_job(worker,'cron',day="*/1", timezone=pytz.utc)
    # 改为下面这个时区,就是亚洲上海,与我们时间一致,也就能最好的解决这个问题
    timezone=pytz.timezone('Asia/Shanghai')
  2. 还有一种方法,就是更改你的系统和docker的时区,因为apscheduler的时间是根据你本机的时区来进行的。

    1: 以ubuntu为例,更改时区

    date -R或者timedatectl status都能查看时区,然后修改时区timedatectl set-timezone "Asia/Shanghai"

    2: 修改docker的时区

    这个呢,可以在启动容器时将本地的时区文件挂载映射,看起来像是这样:

    docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it ubuntu bash

    或者直接在dockerfile中添加上RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

问题完美解决