Celery beat_schedule使用了错误的时区



我正试图使用celener-beat运行一项日常任务,作为Django web应用程序的一部分,该应用程序调用一个带有日期字符串参数的函数。节拍时间表运行良好,每天都会在正确的时间调用函数,但输入到函数的日期字符串总是滞后一天。我认为这是因为时区设置错误,但我认为我已经正确地配置了Django和芹菜,所以我看不出问题出在哪里

./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.utils.timezone.now不会做您认为它会做的事情。根据文档,它将返回UTC时间,时区设置为UTC。它不会按照您的意愿返回Europe/London中的时间:

如果USE_TZTrue,则这将是一个以UTC表示当前时间的感知datetime。请注意,无论TIME_ZONE的值如何,now()都将始终返回UTC时间;您可以使用localtime()获取当前时区中的时间。

正如文档所建议的,使用localtime而不是now

相关内容

  • 没有找到相关文章

最新更新