2012-02-26 23 views
9

私はDjangoでフォームを作成しています。私は入力形式のフィールドを置く必要があります。これは、データベースにタイムゾーンを格納するだけです(フォームのドロップダウンリストからユーザーが選択します)。私は、このタイムゾーンモデルを作成する方法と、保存されたタイムゾーンに従ってローカル時間を返す方法を見つけることができません。私は、次のフィールドを選択したが、それはDjangoモデルのタイムゾーンを保存

もまた分時間と第二の格納
timestamp = models.DateTimeField() 

ドロップダウンリストがの形にする必要があります: ... GMT +5:30 GMT +6:00 ...などに。

答えて

11

djangoとpythonのどちらも、使用するタイムゾーンのセットを提供していません。

そのためには、pytzのような追加モジュールが必要です。

>>> import pytz 
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 
'Africa/Asmera'.... 

あなた自分の店舗CharFieldでのタイムゾーンの名前を付けることができます:あなたはこのようなすべてのタイムゾーンのリストを取得することができます。

ところで、「GMT + 6:00」でタイムゾーンを選択することはお勧めできません。たとえば、ESTは通常GMTの5時間遅れですが、夏時間の2週間ぐらいの間はオフセットが異なります。また、ある年のある時期には、クイーンズランド州とニューサウスウェールズ州のどちらにも同じGMTオフセットがありますが、NSWにはDSTとクイーンズランド州がないため、GMTオフセットは半年ごとに異なります。タイムゾーンを一覧表示する唯一の安全な方法は、実際の地理的タイムゾーンを一覧表示することです。

+0

このアプリはそこにPytzが走っている環境でなければなりませんか? –

4

私がこれを行う方法は、pytzの有効なタイムゾーン名を使用しています。私はその後、などのCharフィールドとしてタイムゾーンを設定した場所のクラスを持っているすなわち

TIMEZONES = (
    'Canada/Atlantic', 
    'Canada/Central', 
    'Canada/Eastern', 
    'Canada/Mountain', 
    'Canada/Pacific', 
) 

、私は必要なものだけを反映するように、私のリストを調整する:私は空白&ヌルを設定

class Location(models.Model): 
    .... 
    time_zone = models.CharField(max_length=100, blank=True, null=True, choices=TIMEZONES) # 64 min 
    .... 

お知らせフィールドをオプションにするにはTrueに設定します。詳しいアイデアについては、django-timezone-field fields.pyをご覧ください。 pytzと私のコードでこれを使用するには

、私はタイムゾーンをインポートします。

from pytz import timezone 
import datetime 
from locations.models import Location # my object that has the time_zone field 
loc = Location.objects.get(pk=1) #get existing location or your object that has time_zone field 
utc = pytz.utc 
some_utc_date = datetime.datetime(2002, 10, 27, 6, 0, 0).replace(tzinfo=utc) #tz aware 
some_date.astimezone(timezone(loc.time_zone)) 

は、あなたの位置に対応する日時フィールドでのdatetime.datetime(2002、10、27、6、0、0)を交換またはtime_zoneフィールドを持つ特定のオブジェクトです。私の場合、すべての日付フィールドをUTC形式でMongoDBコレクションに格納します。データを取得して人間が読み取り可能な出力を作成する場合は、上記の方法を使用して出力に日付を表​​示します。テンプレートでこれを処理するカスタムタグを作成することもできます。詳細は、pytz docを参照してください。彼/彼女が実行したとき、私はそうどこかで自分のアプリケーションをsumbitしたい

0

私は上記の答えは、すべての非常に素晴らしく、正しいと思うが、私は簡単な例として、ここでは鉱山をLEVE ...

class UserProfile(models.Model): 

    import pytz 
    TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) 

    # ... 
    timezone = models.CharField(max_length=32, choices=TIMEZONES, 
    default='UTC') 
# ... 
関連する問題