Celery beat_schedule 使用了错误的时区
Celery beat_schedule using wrong timezone
我正在尝试 运行 作为我的 Django Web 应用程序的一部分使用 celery beat 的日常任务,它调用一个带有日期字符串参数的函数。节拍时间表工作正常,每天在正确的时间调用函数,但输入到函数的日期字符串总是晚一天。我假设这是因为时区设置错误,但我认为我已经正确配置了 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
并不像您认为的那样。 According to the docs 它将 return UTC 时间,时区设置为 UTC。它不会 return Europe/London
中的时间如你所愿:
If USE_TZ
is True
, this will be an aware datetime
representing the current time in UTC. Note that now()
will always return times in UTC regardless of the value of TIME_ZONE
; you can use localtime()
to get the time in the current time zone.
如文档所建议,使用 localtime
而不是 now
。
我正在尝试 运行 作为我的 Django Web 应用程序的一部分使用 celery beat 的日常任务,它调用一个带有日期字符串参数的函数。节拍时间表工作正常,每天在正确的时间调用函数,但输入到函数的日期字符串总是晚一天。我假设这是因为时区设置错误,但我认为我已经正确配置了 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
并不像您认为的那样。 According to the docs 它将 return UTC 时间,时区设置为 UTC。它不会 return Europe/London
中的时间如你所愿:
If
USE_TZ
isTrue
, this will be an awaredatetime
representing the current time in UTC. Note thatnow()
will always return times in UTC regardless of the value ofTIME_ZONE
; you can uselocaltime()
to get the time in the current time zone.
如文档所建议,使用 localtime
而不是 now
。