2016-07-15 3 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)を選択することができる、私は、タイムゾーンを設定しますデータベースは、その後、(SELECT文は私のローカルタイムゾーンでそれを与える)、データベースにUTCとして日時を保存する

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() 

:今

# 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 

次のように私の見解では与えられたものに日時の私が苦労している2つのことがありますith:

1)私は指定されたタイムゾーンで日付を表示したいが、TIME_ZONE設定をデフォルトにすることはできない。

2)ユーザーがレコードを編集した場合、編集フィールドに表示される時間は、元の時刻(14:00)に表示され、現在のタイムゾーン(17:00)に表示されます。

答えて

0

はあなたの設定ファイルに真USE_TZ =を持っていますかにsettings.py

0

であなたのタイムゾーンの設定を確認してください? djangoadmin-startprojectコマンドを使用してアプリケーションを作成した場合は、デフォルトで設定されています。

また、私は最後の仕事でタイムゾーンに苦労しましたが、pytzを使用すると本当に助けになりました。あなたはまだそのパッケージを試しましたか?

EDIT:[OK]を男は私が道をオフかもしれないが、他の誰もが答えたと私はタイムゾーンの闘争を感じているので、ここであなたがtz_info =なしで日付オブジェクトを交換している私は気づいた何か...

あり、代わりにそれをデータベースからのタイムゾーンに置き換えたいとは思わないでしょうか?だから、あなたはそのタイムゾーンを取得し、有効なフォーマット(tzinfo = blah ...)を使用して置き換えますか? 私が言ったように、私は道が外れているかもしれないが、もしそれがあなたを助けたら行く。

+0

おかげで、私は今それを考え出した、私は投稿のコードでは、 '(=なしたtzinfo)置き換える'の後に日時、行を格納するための正しいですタイムゾーンをユーザーが選択したタイムゾーンに設定します(dive.timezoneはpytzタイムゾーンオブジェクトです)。 – xeonman9000

0

申し訳ありませんが、私は私の問題を非常にうまく説明したとは思わない。私はついにこのことを理解したので、自分の質問に答えます。

1)Djangoが与えられたゾーンで時間を表示するためのテンプレートタグを持って、簡単であることが判明:2の場合

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

)、私が出会った[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/

関連する問題