簡體   English   中英

Python 字符串到 Django 時區(知道日期時間)

[英]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_dateunaware_end_date DateTime對象。 然后它使用pytz.utc.localize使對象具有時區意識(您需要將utc替換為您的相關時區)。

然后,您可以擁有時區感知DateTime對象 - aware_start_dateaware_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM