2016-07-15 57 views
0

我正在開發用於記錄潛水的Django應用程序,並且每個潛水都有一個日期時間和一個時區。我爲時區使用了django-timezone-field應用程序。在Django中使用給定的時區顯示時間

class Dive(models.Model): 
    ... 
    date_time_in = models.DateTimeField(default=timezone.now) 
    timezone = TimeZoneField(default=timezone.get_current_timezone_name()) 

因此,用戶能夠輸入的時間字符串(「2016年7月11日14時00分」),並選擇一個時區(「亞洲/曼谷」 - UTC + 0700),我然後設置時區

def log_dive(request): 
    if request.method == 'POST': 
    form = DiveForm(request.POST) 
    if form.is_valid(): 
     dive = form.save(commit=False) 
     date = dive.date_time_in 
     date = date.replace(tzinfo=None) 
     dive.date_time_in = dive.timezone.localize(date) 
     dive.save() 

然後,數據庫存儲日期時間爲UTC在數據庫(SELECT語句使得它在我的本地時區):

# SELECT date_time_in, timezone FROM divelog_dive ORDER BY number DESC; 
     date_time_in  |  timezone  
------------------------+------------------ 
2014-07-11 17:00:00+10 | Asia/Bangkok 

現在的日期時間在我看來,給這樣的一個有兩件事我正在掙扎着ith:

1)我想在給定的時區顯示日期,但我似乎無法阻止它默認爲TIME_ZONE設置。 2)如果用戶編輯記錄,編輯欄中顯示的時間應該是他們最初輸入的時間(14:00),而不是當前時區(17:00)顯示的時間。

回答

0

檢查settings.py

0

你的時區設置你有沒有在你的設置USE_TZ =真正的文件?如果您使用djangoadmin-startproject命令創建了應用程序,則會默認設置它。

另外,我在最後一份工作上與時區打了仗,但發現使用pytz確實有幫助。你有沒有試過這個軟件包?

編輯:好的人,我可能是遙遠,但因爲沒有人其他人已經回答了,我覺得時區掙扎,這裏是我注意到...

您與tz_info =無更換日期對象,但是你不想用數據庫中的時區替換它嗎?所以你會得到那個時區,並使用有效格式進行替換(tzinfo = blah ...)? 就像我說的我可能會離開,但如果這有助於你去。

+0

感謝您的幫助克里斯,我現在已經想通了,我貼的代碼是用於存儲日期時間,線路後'替換(tzinfo =無)正確的'將時區設置爲用戶選擇的時區(dive.timezone是pytz時區對象)。 – xeonman9000

0

對不起,我不認爲我很好地解釋了我的問題。我終於明白了這一點,所以我會回答我自己的問題。

1)原來是很容易,Django中有一給定區域顯示次模板標籤:

{{ dive.date_time_in|timezone:dive.timezone|date:"Y-m-d H:i e" }} 

對於2),我碰上了[1]這導致我這個解決方案:在該視圖在從數據庫獲取對象後,使用astimezone(...)將日期值(DB存儲爲UTC)轉換爲給定的時區。然後,我使用replace(tzinfo = None)使它變得幼稚,然後在我的表單上正確顯示。

def edit_dive(request, dive_id=None): 
    dive = None 
    if dive_id != None: 
    dive = get_object_or_404(Dive, pk=dive_id) 
    local_date = dive.date_time_in.astimezone(timezone(str(dive.timezone))) 
    dive.date_time_in = local_date.replace(tzinfo=None) 

[1] http://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

相關問題