how to make sure that the UTC date saved in the database is equivalent to midnight in the specified timezone in Django
本问题已经有最佳答案,请猛点这里访问。
我想将数据库中的日期时间保存为特定用户的午夜。 我将时区保存在用户对象上。 但是,数据库会将其保存为UTC的午夜。 以下是我正在使用的代码。
1 2 3 4 5 | tz_obj = pytz.timezone(user.timezone) start_date = tz_obj.normalize(date_obj.replace(day=1, hour=0, minute=0, second=0, microsecond=0)) end_date = tz_obj.normalize(date_obj.replace(day=calendar.monthrange(date_obj.year, date_obj.month)[1], hour=23, minute=59, second=59, microsecond=99999)) obj = MyObject.objects.create(start=start_date, end=end_date) |
有人可以告诉我如何确保数据库中保存的UTC日期等于指定时区的午夜。
更新
每个用户可能有不同的时区,因此在设置文件中设置时区不能解决此问题。
Django有一个名为
1 | aware_date_obj = make_aware(date_obj, user.timezone) |
由于datetime对象已经链接到正确的时区,因此您只需使用
如果datetime对象已识别时区但未在正确的时区中,则可以使用
1 | date_obj.astimezone(user.timezone) |
然后你可以再次使用
最后,当Django将datetime对象存储在数据库中时,时区信息将丢失。时间点仍然正确,但在从数据库加载后,它将链接到默认的django时区。然后,您将再次使用
注意:与评论一样,这种方法不正确。我们需要在用户的时区中使用
因此,我们需要:
如果我的问题是正确的,你想在假设的时区
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> from datetime import date, time, datetime >>> naive_midnight = datetime.combine(date.today(), time()) >>> tz = pytz.timezone('Asia/Kolkata') >>> >>> # Attach local timezone to above naive datetime object >>> midnight_user_timezone = tz.localize(naive_midnight) >>> print midnigth_user_timezone 2015-12-15 00:00:00+05:30 >>> >>> # Convert to UTC >>> midnight_to_utc = midnight_user_timezone.astimezone(pytz.UTC) >>> print midnigth_to_utc 2015-12-14 18:30:00+00:00 |