Celery beat_schedule使用错误的时区

问题描述 投票:0回答:1

我正在尝试使用celery beat作为我的Django Web应用程序的一部分运行一项日常任务,该任务调用带有日期字符串参数的函数。节拍时间表可以很好地工作,并每天在正确的时间调用该函数,但是输入到该函数的日期字符串始终落后一天。我认为这是因为时区设置错误,但是我认为我已经正确配置了Django和celery,所以我看不出问题出在哪里。

./settings.py中的相关设置:

TIME_ZONE = 'Europe/London'
USE_TZ = True
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = TIME_ZONE

./my_project/celery.py中的我的芹菜配置:

from django.utils import timezone
from celery import Celery
from celery.schedules import crontab


app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

# Configure daily tasks
app.conf.beat_schedule = {
    # Executes `my_task` every day at 10:00am
    'do-my-task': {
        'task': 'tasks.tasks.my_task',
        'schedule': crontab(minute=0, hour=10),
        'args': (timezone.now().strftime('%d/%m/%Y'), ),
    },
}

任何想法为什么要为此输入错误的日期字符串作为my_task的参数?

django celery celerybeat
1个回答
0
投票

django.utils.timezone.now不执行您认为的操作。 According to the docs它将返回时区设置为UTC的UTC时间。您不会根据需要返回Europe/London中的时间:

如果USE_TZTrue,则这将是表示[UT]的UTC时间。请注意,无论datetime的值如何,now()始终将以UTC返回时间。您可以使用TIME_ZONE来获取当前时区的时间。

根据文档建议,使用localtime()而不是localtime

© www.soinside.com 2019 - 2024. All rights reserved.