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))
问题出在过滤器上。由于djanto设置的时区,我失去了几个小时。
UPDATE1:我不需要将datetime.now()
转换为我的时间..我需要将字符串转换为日期时间..
有人帮忙吗?
提前致谢
答案 0 :(得分:12)
我知道这已经过时但也许会有所帮助,因为我也遇到了这种情况:
使用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'))
这将使用settings.py
中指定的TIME_ZONE答案 1 :(得分:6)
您正在将时区无意识的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_date
创建unaware_end_date
和DateTime
strptime()
个对象。然后,它使用pytz.utc.localize
使对象能够识别时区(您需要将utc
替换为相关的时区)。
然后,您可以拥有时区感知DateTime
个对象 - aware_start_date
和aware_end_date
。将这些食物喂入过滤器应该会产生预期的效果。
答案 2 :(得分:0)
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)