Python 如何确保数据库中保存的UTC日期与Django中指定时区的午夜相等

Python 如何确保数据库中保存的UTC日期与Django中指定时区的午夜相等,python,django,timezone,Python,Django,Timezone,我想为特定用户将数据库中的日期时间保存为午夜。我将时区保存在我的用户对象上。但是,数据库会在UTC中将其保存为午夜。下面是我正在使用的代码 tz_obj=pytz.timezone(user.timezone) 开始日期=tz目标正常化(日期目标替换(天=1,小时=0,分钟=0,秒=0,微秒=0)) 结束日期=tz对象正常化(日期对象替换(日期=日历月)(日期对象年,日期对象月)[1],小时=23,分钟=59, 秒=59,微秒=99999) obj=MyObject.objects.create

我想为特定用户将数据库中的日期时间保存为午夜。我将时区保存在我的用户对象上。但是,数据库会在UTC中将其保存为午夜。下面是我正在使用的代码

tz_obj=pytz.timezone(user.timezone)
开始日期=tz目标正常化(日期目标替换(天=1,小时=0,分钟=0,秒=0,微秒=0))
结束日期=tz对象正常化(日期对象替换(日期=日历月)(日期对象年,日期对象月)[1],小时=23,分钟=59,
秒=59,微秒=99999)
obj=MyObject.objects.create(开始=开始日期,结束=结束日期)
有人能告诉我如何确保数据库中保存的UTC日期等于指定时区的午夜吗

更新
每个用户可能有不同的时区,因此在设置文件中设置时区并不能解决此问题。

注意:与注释一样,此方法不正确。我们需要在用户的时区中选取
date
对象,如重复问题中的答案所示

因此,我们需要:
datetime.now(tz).date()
,而不是
date.today()


如果我没弄错你的问题,你想把午夜存储在假定时区
+5:30
,作为UTC的
18:30
?如果是这样,您可以这样做:

>>> 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

Django有一个名为
make_aware
的函数,用于将时区原始datetime对象转换为时区感知datetime对象

aware_date_obj = make_aware(date_obj, user.timezone)
由于datetime对象已链接到正确的时区,因此您只需在
aware\u date\u obj
上使用
.replace(天=1,小时=0,分钟=0,秒=0,微秒=0)
,即可获得指定时区的年初

如果datetime对象已识别时区,但不在正确的时区中,则可以使用
astimezone
将其转换为正确的时区:

date_obj.astimezone(user.timezone)
然后,您可以再次使用
.replace
功能


最后,当Django在数据库中存储datetime对象时,时区信息将丢失。时间点仍然正确,但在从数据库加载之后,它将链接到默认的django时区。然后,您必须再次使用
astimezone
功能将其链接到正确的时区

@DhiaTN:每个用户可以有不同的时区。你提供的答案没有帮助。我不是有意要+1你的评论。你的问题不够清楚,很高兴你更新了:)对不起。我想我已经在显示时区保存在用户对象上了。这里的三个答案都是错误的。没关系。对复制品的公认答案也已经错了好几年了(现在错的更少了——它适用于更多的情况)。如果你需要一个正确的结果(根据tz数据库),或者当代码无法得到结果时,需要一个响亮的失败,请使用我的答案。这是有效的。最后一步是不必要的,因为Django默认保存为UTC。@Dan:这是错误的,除非服务器的本地时区是Asia/Kolkata,否则它无法工作。您的服务器的时区应该是无关的,它不能在所有情况下都等于
user.timezone
(用户可能使用不同的时区)。@J.F.Sebastian我不明白。你能解释一下这种方法有什么问题吗?那太好了:)你知道本地日期(
date.today()
)可能不同于
user.timezone
datetime.now(tz).date()
)中的日期吗?把我的答案读一遍question@J.F.Sebastian哦,是的。这可能会造成1天的差异。知道了。谢谢:)
.replace(day=1,hour=0)
关于时区感知的datetime对象可能会跨越DST边界(结果可能有错误的utc偏移量)。阅读我对重复问题的回答,了解如何正确计算午夜。