3

datetime .isoformat()Python関数が正しい情報を返さないことにちょっと驚いています。fromtimestamp()メソッドにタイムゾーンが指定されている場合、この関数はISO8601形式の文字列を正しく返します。ただし、結果の計算ではタイムゾーンは無視されます。観察:

13:29 msimsonnet:~$ python
Python 2.7.1 (r271:86832, Jan 26 2011, 13:56:46) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Running with pythonstartup.py
>>> import pytz,datetime
>>> datetime.datetime.fromtimestamp(1303876413).isoformat()
'2011-04-26T23:53:33'
>>> ny = pytz.timezone('America/New_York')
>>> sf = pytz.timezone('America/Los_Angeles')
>>> datetime.datetime.fromtimestamp(1303876413,ny).isoformat()
'2011-04-26T23:53:33-04:00'
>>> datetime.datetime.fromtimestamp(1303876413,sf).isoformat()
'2011-04-26T20:53:33-07:00'
>>> 

私はこれをEDT(GMTから-400)にあるコンピューターで実行しています。1303876413の時刻は、私が最初に質問を書いた2011年4月26日の午後11時53分33秒です。.isoformat()最初の例では、 returnsを要求するだけであることに注意してください'2011-04-26T23:53:33'。これは間違っています---'2011-04-26T23:53:33-04:00'現地時間を返し、Pythonはタイムゾーンを知っているため、を返す必要があります。2番目の例は正しいですが、NYタイムゾーンオブジェクトでジャミングしています。3番目の例は間違っています---Pythonはタイムゾーンを保持していますが、それに応じて時間を調整していません。

補遺:

すべてのコメントを読むと、私が探していた動作は、utcfromtimestampではなくを使用して見つけることができることがわかりますfromtimestamp

4

1 に答える 1

17

datetime「ナイーブ」オブジェクトではなく、「タイムゾーン対応」オブジェクトを使用していることを確認してください。

タイムゾーンを「認識」datetimeするオブジェクトを作成するには、作成時に必ずタイムゾーンを指定する必要があります。

詳細はこちら: http ://docs.python.org/library/datetime.html

また、ISO 8601はタイムゾーンを必要とせ準拠しています。実際、タイムゾーンはまったくサポートされておらず、UTCからのタイムオフセットのみがサポートされています。isoformat

ISO 8601では、さまざまな形式が許可されています。たとえば、これらはすべて有効です。

2011-04-27
2011-04-27 02:48Z
2011-04-27T02:48Z
2011-W17-3
2011-117

詳細については、 http://en.wikipedia.org/wiki/ISO_8601を参照してください。

編集して、更新に対処します。

バグはなく、正しく動作し、ドキュメントによると。ナイーブな日時オブジェクトには、タイムゾーン情報や期間がありません。したがって、電話をかけたときにタイムゾーン情報を提供できると期待する理由はありませんisoformat()

タイムスタンプを使用してオブジェクトを作成すると、Pythonがシステムのタイムゾーンと見なすものに基づいて、現地時間の日時オブジェクトが作成されます。そのため、posixタイムスタンプを指定すると、現地時間に変換されます。datetimeモジュールはタイムスタンプがUTCであることを認識し、ローカルタイムゾーンを認識fromtimestampし、その情報を使用して日時オブジェクトを作成しますが、結果のオブジェクトはナイーブであり、タイムゾーンについては何もしません。タイムスタンプを使用する場合は、単純な日時オブジェクトを使用しないでください。

ドキュメントから:

ナイーブな日時オブジェクトが協定世界時(UTC)、現地時間、または他のタイムゾーンの時間を表すかどうかは、特定の数値がメートル、マイル、または質量を表すかどうかがプログラム次第であるのと同様に、純粋にプログラム次第です。ナイーブな日時オブジェクトは、現実のいくつかの側面を無視するという犠牲を払って、理解しやすく、操作しやすいものです。

メソッドのドキュメントは次のfromtimestampとおりです(太字を追加)。

time.time()によって返されるような、POSIXタイムスタンプに対応するローカルの日付と時刻を返します。オプションの引数tzがNoneまたは指定されていない場合、タイムスタンプはプラットフォームのローカル日時に変換され、返される日時オブジェクトは単純です。

タイムゾーンを考慮したい場合は、タイムゾーンを通過する必要があります。タイムゾーンは推測されません。 それがあなたがすべきだと思うことをしないからといって、それが非準拠またはバグになることはありません。意図したとおりに機能し、文書化されています。それはバギーの正反対です。

于 2011-04-27T04:02:59.590 に答える