2011-12-14 21 views
4

は、次のコードを考える:もしそうなら、これは、OverflowErrorを「範囲外の関数mktime引数」を生成し、するためにPythonのmktimeの往復が「範囲外」で失敗する可能性はありますか?

value = time.mktime(datetime.fromtimestamp(timestamp).timetuple()) 

が、それは可能ですが、タイムスタンプのどの範囲はこれを引き起こしますか?

+0

これがなぜ投票されたのかわかりません。私はそれが少し具体的であることを認識していますが、私はPythonの動作/制限について実際の質問をしています。 – DNS

+0

+1はい私にとって有効な質問です –

答えて

3

はい。私はUTCとWindowsの2時間前です。 int32の範囲の最後の2時間でエラーが発生します。

>>> def roundtrip(x): 
...  return time.mktime(datetime.datetime.fromtimestamp(x).timetuple()) 
... 
>>> roundtrip(2**31-1-7200) 
2147476447.0 
>>> roundtrip(2**31-7200) 
OverflowError: mktime argument out of range 
>>> roundtrip(2**31-1) 
OverflowError: mktime argument out of range 
>>> roundtrip(2**31) 
ValueError: timestamp out of range for platform time_t 
1

NB:あなたはそれを求めてきました方法は、私はそれは同じで(おそらく)バインドされているようdatetime.fromtimestampが、代わりにValueErrorが発生しますので、あなたが探している特定の例外をトリガする一切の可能なタイムスタンプがありません推測します限界。

ここでmktimeの範囲はプラットフォームによって異なりますので、明確な回答はできません。私のLinux 32ビットコンピュータでは、境界は符号付きの32ビット整数の範囲内にあるため、-2147483648(すなわち(1901, 12, 13, 19, 44, 16)より前)または2147483647より前に変換するタプル、つまり(2038, 1, 19, 3, 14, 7)がこの例外をトリガーします。 、datetime.fromtimestampはそれを早く捕まえるでしょう。