-
Notifications
You must be signed in to change notification settings - Fork 467
Open
Description
I checked the solutions in celery/django-celery-beat/issues/798, specifically #798 (comment).
However, this still doesn't solve the problem.
Core Problem Statement
The root cause occurs when USE_TZ
≠ DJANGO_CELERY_BEAT_TZ_AWARE
This mismatch creates timezone awareness incompatibility between
leading to TypeError: can't compare offset-naive and offset-aware datetimes
during time comparisons.
Key Conflict Points
Django's USE_TZ Behavior
Setting | Storage Behavior | Read Behavior |
---|---|---|
USE_TZ=True |
Stores all times as UTC | Converts to UTC timezone when reading |
USE_TZ=False |
Stores timezone-naive times | Reads timezone-naive times |
Celery Beat's DJANGO_CELERY_BEAT_TZ_AWARE Behavior
Setting | Time Generation Method |
---|---|
True |
datetime.now(self.app.timezone) (timezone-aware) |
False |
datetime.utcnow() (timezone-naive UTC) |
def _default_now(self):
if getattr(settings, 'DJANGO_CELERY_BEAT_TZ_AWARE', True):
now = datetime.datetime.now(self.app.timezone)
else:
# this ends up getting passed to maybe_make_aware, which expects
# all naive datetime objects to be in utc time.
now = datetime.datetime.utcnow()
return now
Conflict Scenarios Analysis
Scenario | DJANGO_CELERY_BEAT_TZ_AWARE | USE_TZ | _default_now() Returns | ORM Returns | Result |
---|---|---|---|---|---|
1 | True | False | Timezone-aware | Timezone-naive | Comparison error |
2 | False | True | Timezone-naive | Timezone-aware | Comparison error |
3 | True | True | Timezone-aware | Timezone-aware | Valid |
4 | False | False | Timezone-naive | Timezone-naive | Valid |
Core Problems with last_run_at
When USE_TZ
≠ DJANGO_CELERY_BEAT_TZ_AWARE
:
Celery Version: 5.5.1
Celery-Beat Version: 2.8.1
Metadata
Metadata
Assignees
Labels
No labels