2013-11-05 13 views
6

関連する日付を収集せずにユーザーから時刻を収集する必要がある場合があります。たとえば、ユーザーが毎日実行する繰り返しイベントを同時に設定している場合などです。 DjangoのTimeFieldはタイムゾーンで再生されません。しかし、この特定のケースでは(おそらくあなた自身で時刻を記録するときは)、タイムゾーンが重要な要素です。だから、どのようにタイムゾーン対応の時間を保存しますか?TimeFieldをタイムゾーン対応にするには?

答えて

4

答えはありません。タイムゾーンを認識するためには、それに関連付けられた日付が必要です。このため私のソリューションは、モデルにDateTimeFieldを使用するので、のような形を上書きすることだった...夏時間を考える:

# Model 
class MyModel(models.Model): 
    time_of_day = models.DateTimeField() 

# Form Fields 
from django.forms.util import from_current_timezone 
from django.forms.util import to_current_timezone 
from django.utils import timezone 

class TzAwareTimeField(forms.fields.TimeField): 
    def prepare_value(self, value): 
     if isinstance(value, datetime.datetime): 
      value = to_current_timezone(value).time() 
     return super(TzAwareTimeField, self).prepare_value(value) 

    def clean(self, value): 
     value = super(TzAwareTimeField, self).to_python(value) 
     dt = to_current_timezone(timezone.now()) 
     return dt.replace(
      hour=value.hour, minute=value.minute, 
      second=value.second, microsecond=value.microsecond) 


# Forms 
class MyForm(forms.ModelForm): 
    time_of_day = TzAwareTimeField() 
+3

あなたのopening文(とDjangoの動作)は、Pythonが 'time'オブジェクトをどのように扱うかとは異なります。 Pythonの 'time'オブジェクトは' tzinfo'フィールドを持つことができます。これは、日付が関連付けられていないタイムゾーンを認識できる 'time'オブジェクトを可能にします。私はちょうどこの問題をDjangoの 'Day'モデルで' open_time'と 'close_time'' TimeField'sに渡しました。これらの時代は理想的にはタイムゾーンを意識したものになるでしょうが、Djangoはそれをサポートしていないためではありません。 – jbg

+0

これは古いですが、まだ便利なので、 'from_current_timezone'に' clean'メソッドの戻り値をラップする必要があると私は指摘したいと思います。 –

0

これはテストされていないと不完全です:

class TimeFieldWithZone(TimeField): 
    def db_type(self, connection): 
     if (connection.settings_dict['ENGINE'] == 
      'django.db.backends.postgresql_psycopg2'): 
      return 'time with time zone' 
     raise Exception('Unsupported database type') 

    def get_db_prep_value(self, value, *args, **kwargs): 
     try: 
      return super(TimeFieldWithZone, self).get_db_prep_value(
       value, *args, **kwargs) 
     except ValueError: 
      return six.text_type(value) 

これが使用されますPostgresのtime with time zoneデータ型。 'HH:MM:SS.mmmmmm + HH:MM'の形式で文字列を渡すと、auto_nowを使用して邪魔になります。

あなたはUTC以外のタイムゾーンで時間を挿入しようとすると例外がスローされ、一般的なバックエンドのコードで編集

。 2

編集私は文字列にタイムゾーンを備えtimeを変換するget_db_prep_value更新添加が、提供時間帯は、(日付無し曖昧であってもよい)UTCオフセットを出力する場合にのみ動作します。

time with time zoneはちょっと誤解されているようです...私が言うことができる限り、実際にはタイムゾーンではなく、UTCオフセットで時刻を保存します。したがって、返された値を取り、カレンダーの日付を追加し、夏時間に関する適切な時刻を取得することは困難です。

関連する問題