Python 字符串到 Django 时区(知道日期时间)

新手上路,请多包涵

长话短说;博士;

如何将 2016-01-01 转换为 Django timezone

完整版

我从表单收到一个查询字符串参数,我想获取该字符串并将其用作 Django 中的日期时间过滤器。问题是,当我将字符串转换为日期时间时,它并没有意识到日期时间,因此由于时区不同,我损失了几个小时。也许我在格式化中迷失了自己,但我做不到。

我有 pytz,我的设置中也有 USE_TZ = True

例子:

 from datetime import date
# Example from what I receive as GET querystring parameter
start_date, end_date = '15-01-2016', '16-01-2016'
DATE_FORMAT = '%Y-%m-%d'
start_date = start_date.split('-')
start_date = date(int(start_date[2]), int(start_date[1]), int(start_date[0]))
sd_filter = start_date.strftime(DATE_FORMAT)

end_date = end_date.split('-')
end_date = date(int(end_date[2]), int(end_date[1]), int(end_date[0]))
ed_filter = end_date.strftime(DATE_FORMAT)

#query
my_list = MyModel.objects.filter(created_at__range=(sd_filter, ed_filter))

问题出在过滤器上。由于 Django 设置的时区,我损失了几个小时。

更新: 我不需要将 datetime.now() 转换为我的时间。我需要将字符串转换为日期时间。

原文由 jarussi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我知道这是旧的,但也许会有所帮助,因为我也遇到了这种情况:

使用 make_aware() 怎么样?

 from datetime import datetime
from django.utils.timezone import make_aware

date = '22-05-2018'
aware = make_aware(datetime.strptime(date, '%d-%m-%Y'))

这将使用当前活动的时区(由 timezone.activate 激活)。如果没有明确激活时区,它将使用默认时区 -- TIME_ZONEsettings.py --- 中指定。

原文由 Gustavo A. Díaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

您正在比较时区意识 Python Date 对象与时区意识 DateTimeField 数据库中的字段。使用 DateTime 对象可能更直观 - 这些可以很容易地识别时区,如下所示:

 import datetime
import pytz

start_date = '15-01-2016'
end_date = '16-01-2016'
date_format = '%d-%m-%Y'

unaware_start_date = datetime.datetime.strptime(start_date, date_format)
aware_start_date = pytz.utc.localize(unaware_start_date)

unaware_end_date = datetime.datetime.strptime(end_date, date_format)
aware_end_date = pytz.utc.localize(unaware_end_date)

my_list = MyModel.objects.filter(created_at__range=(aware_start_date, aware_end_date))

这将创建 unaware_start_dateunaware_end_date DateTime 使用 strptime() 的对象然后它使用 pytz.utc.localize 使对象具有时区意识(您需要将 utc 替换为您的相关时区)。

然后,您可以了解时区 DateTime 对象 - aware_start_dateaware_end_date 。将这些输入过滤器应该会产生预期的结果。

原文由 gtlambert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题