2017-02-22 11 views
3

Django docs氏は述べています:あなたが作るしようとした場合Djangoのmake_awareの使用量は、

pytz.NonExistentTimeError例外が発生します(DSTに入る際に)時間が 発生したことがないよう、DST移行中に意識 valueis_dst~TrueまたはFalseを設定すると、時間を前後に1:ずつ移動することによって、 の例外が回避されます。たとえば、is_dst=Trueは、存在しない の時刻を2:30から1:30に変更し、is_dst=Falseから時刻を3:30に変更します。

is_dstの値に応じて、時間を前後にずらすことができます。

私のテストから、タイムゾーンはシフトされていますが、時間はシフトされていません。私はDjangoのドキュメントを誤解していますか?これはバグですか?

私は次のようにテストした:

import pytz 
import datetime 
from django.utils.timezone import make_aware 

tz = pytz.timezone('America/Sao_Paulo') 
dt = datetime.datetime(2017, 10, 15 ,0 ,0) 
print(make_aware(dt, tz))  # NonExistentTimeError 
print(make_aware(dt, tz, True)) # 2017-10-15 00:00:00-02:00 
print(make_aware(dt, tz, False)) # 2017-10-15 00:00:00-03:00 

2017年10月15日には、クロックが01:00にジャンプする必要があります0時00分に達したときにDSTはそう、そのAmerica/Sao_Pauloタイムゾーンで開始されたときです。 make_awareメソッドによって返される日付時刻は存在しません。

+1

インポートステートメントが追加されました。 'pytz'は[Pythonの世界タイムゾーン定義](http://pytz.sourceforge.net/) –

+0

です。 'make_aware'は[pytz'タイムゾーンのための別のコードパス]を持っています(https://github.com/django/django/blob/1.11b1/django/utils/timezone.py#L284) –

答えて

1

source codeから、私たちはDjangoがちょうどpytzをラップしていることがわかります。だからここに問題がある場合は、pytzバグかDjangoのドキュメントバグのいずれかです。

今は、存在しない時間がlocalize()であるため、有効期限を返すように壁時計の時刻またはtzinfoを変更する必要があります。 pytz documentationはこの時点ではあまり正確ではありませんが、渡されたものと同じ壁時計の時刻を使用して常にdatetimeを返すという契約が成立しているようです。特に、あいまいな時間。

だから私はそれを言うときDjangoのドキュメントは誤りであると思う:TrueまたはFalseis_dstを設定

がそれぞれ1で前後に時間を移動することによって、例外を回避します。たとえば、is_dst=Trueは、存在しない時間を2:30〜1:30に変更し、is_dst=Falseは時間を3:30に変更します。

注意は、しかし、時間の実際の瞬間には、ドキュメントを記述したものと同じであること:

tz = pytz.timezone('America/Sao_Paulo') 
dt = datetime.datetime(2017, 10, 15, 0) 
dt_plus_one = datetime.datetime(2017, 10, 15, 1) 
dt_minus_one = datetime.datetime(2017, 10, 14, 23) 

make_aware(dt, tz, True) == make_aware(dt_minus_one, tz) # True 
make_aware(dt, tz, False) == make_aware(dt_plus_one, tz) # True 

これについてfiling a ticketをご検討ください!

+0

ケビン、ありがとう回答。あなたのテストによって、私はこの方法の仕組みを理解できました。 'make_naive'メソッドは予想される日時を表示します。 :) –

+0

あなたや他の人が興味を持っているなら、DjangoのプラグインPR [here](https:// github。com/carltongibson/django-filter/pull/634) –