[英]How to convert a timezone aware string to datetime in Python without dateutil?
[英]Python string to Django timezone (aware datetime)
長話短說;博士;
如何將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()
轉換為我的時間。 我需要將字符串轉換為日期時間。
我知道這是舊的,但也許會有所幫助,因為我也遇到了這種情況:
使用 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
激活)。 如果沒有明確激活時區,它將使用默認時區——在settings.py
中指定的TIME_ZONE
。
您正在將不了解時區的 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
。 將這些輸入過濾器應該會產生預期的結果。
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}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.