1👍
import pytz, datetime
from django.db.models import Max, F, Func
from django.conf import settings
from myapp.models import myModel
local_tz = pytz.timezone(settings.TIME_ZONE)
local_datetime = local_tz.localize(datetime.datetime(2037, 4, 8, 20, 14, 17), is_dst=None)
utc_datetime = local_datetime.astimezone(pytz.UTC)
# datetime.datetime(2037, 4, 9, 0, 14, 17, tzinfo=<UTC>)
MyModel.objects.create(my_date=utc_datetime)
x = MyModel.objects.aggregate(max1=Max('my_date'),max2=Max(Func(F('my_date'), function='UNIX_TIMESTAMP')))
pytz.UTC.localize(datetime.datetime.fromtimestamp(x['max2'])).astimezone(local_tz) == x['max1'].astimezone(local_tz)
1👍
The primary difference between datetime
and timestamp
is that timestamp
will automatically store a value as UTC, using the current mysql time_zone
setting, and datetime
will ignore the time_zone
setting when inserting and retrieving records.
You’re using a datetime
field, however you’re also using the mysql UNIX_TIMESTAMP
function against that field. When you do that, the docs explain that the server interprets the value as a local time value, based on the time_zone
setting. This is the source of the conversion discrepancy.
You have two choices.
- Ensure the
time_zone
session variable is set to UTC before running your query. - Store the value into a
timestamp
field instead of adatetime
field.
- [Answered ]-Extending the methods available to the Django User model via a proxy
- [Answered ]-Django versioning static files at collectstatic
- [Answered ]-Django executing backward relation query occurred a maximum recursion depth exceeded error when I use Manager
0👍
Yes. Some of the data is discarded.
Django DateTime field stored data in a database DateTime storage that lacks timezone information thus the information is removed before storage.
This is whet the manual says:
Note that if you set this to point to a DateTimeField, only the date portion of the > field will be considered. Besides, when USE_TZ is True, the check will be performed > in the current time zone at the time the object gets saved.
The proper way to store full datetime date would be to use a DateTimeOffset field – that can be found in MS-Sql and others. But this is not supported (yet?)
- [Answered ]-Second Django Logout Does Not Work
- [Answered ]-How does DRF know a simple POST request should call create()?
- [Answered ]-Regex interpretaion in Django tutorial