Python 字符串到 Django 时区(知道日期时间)
Posted
技术标签:
【中文标题】Python 字符串到 Django 时区(知道日期时间)【英文标题】:Python string to Django timezone (aware datetime) 【发布时间】:2016-04-21 09:41:04 【问题描述】:TL;DR;
如何将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()
转换为我的时间。我需要将字符串转换为日期时间。
【问题讨论】:
您在模型中使用什么字段类型?DateField()
?如果是这样,您可以将两个 date
对象(start_date
和 end_date
)传递给您的 created_at__range=()
过滤器。
Python Timezone conversion的可能重复
@lambo477 这是DateTimeField
,我尝试这样做..但距离UTC还有几个小时。
@LajosArpad 我尝试使用答案中所说的内容,但它对我不起作用:(
【参考方案1】:
我知道这是旧的,但也许会有所帮助,因为我也遇到了这种情况:
使用 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_ZONE
在settings.py
中指定。
【讨论】:
【参考方案2】:您正在将不知道时区的 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))
这将使用strptime()
创建unaware_start_date
和unaware_end_date
DateTime
对象。然后它使用pytz.utc.localize
让对象知道时区(您需要将utc
替换为您的相关时区)。
然后,您可以拥有时区感知 DateTime
对象 - aware_start_date
和 aware_end_date
。将这些输入您的过滤器应该会产生所需的结果。
【讨论】:
如果您没有安装pytz
模块,请从命令行运行pip install pytz
【参考方案3】:
from django.utils import timezone
timestamp_raw = timezone.now() #current time, or use whatever time you have
date_format = '%Y-%m-%d %H:%M:%S' #time format day-month-year hour:minutes:seconds
timestamp = timezone.datetime.strftime(timestamp_raw, date_format)
或者使用新的 f-string 格式化程序
f"timezone:%Y-%m-%d %H:%M:%S %p"
【讨论】:
这是否适用于日期 ISO 字符串? 是的,确实如此。我还编辑了答案以包含使用新的 f 字符串格式化程序的示例。以上是关于Python 字符串到 Django 时区(知道日期时间)的主要内容,如果未能解决你的问题,请参考以下文章