2012-11-06 17 views
25

dtutという関数のペアを作成しようとしていますが、通常のunix時間1970-01-01 00:00:00 UTC)とPython datetimeオブジェクトです。unimetimeをdatetimeオブジェクトに変換して元に戻す(逆変換の時間変換関数のペア)

dtutが適切逆数であった場合、このコードは二度同じタイムスタンプを印刷するであろう:

import time, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.fromtimestamp(u) 
def ut(d): return time.mktime(d.timetuple()) 

u = 1004260000 
print u, "-->", ut(dt(u)) 

ああを、第二のタイムスタンプは最初未満3600秒(時間)です。 これは非常に特定のunixtimesでのみ起こると思います。おそらくその夏時間がスキップする時間帯の間です。 dtutを書く方法はありますか。

関連質問:Making matplotlib's date2num and num2date perfect inverses

+0

、関数は何もしませんが、と別の関数を呼び出す場合同じ引数を指定するだけでよい: 'dt = datetime.datetime.utcfromtimestamp'。関数はPythonのファーストクラスの市民です:それらを別の関数、関数からの戻り値などにパラメータとして渡すことができます。 – jfs

+0

ああ、素敵なポイント!それを行う方が効率的か、簡潔さの問題か? 'def f(x):return foo(x)'と 'f = lambda x:foo(x)'についてはどうでしょうか? (私の想起は、それらが機能的にも効率的にも等価であるということです) – dreeves

+0

'f = g'はf、gが同じ関数を参照する2つの名前であることを意味します。 'def'と' lambda'は新しい関数を作成します。 – jfs

答えて

37

あなたはこの動作が夏時間に関係していることが正しいです。これを回避する最も簡単な方法は、夏時間なしでタイムゾーンを使用することです.UTCはここで最も理にかなっています。

datetime.datetime.utcfromtimestamp()およびcalendar.timegm()は、UTC時間を処理し、正確な逆です。

戻りPOSIXタイムスタンプに対応する、ローカルの日付と時間、などであるとして :ここ

import calendar, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.utcfromtimestamp(u) 
def ut(d): return calendar.timegm(d.timetuple()) 

は説明のビットdatetime.datetime.fromtimestamp()がドキュメントから夏時間の問題を、持っている理由の背後にありますtime.time()によって返されました。オプション引数tzがNoneまたは が指定されていない場合、タイムスタンプはプラットフォームのローカル日付 と時刻に変換され、返されたdatetimeオブジェクトはnaiveです。

ここで重要な部分は、あなたがオブジェクトの一部として、何のタイムゾーン(または夏時間)情報がないことを意味ナイーブdatetime.datetimeオブジェクトを取得することです。あなたが戻って夏時間のロールの間に立ち下がり時間を選ぶことが起こる場合、これは、fromtimestamp()を使用する際に、複数の異なるタイムスタンプが同じdatetime.datetimeオブジェクトにマッピングすることができることを意味します

ところで
>>> datetime.datetime.fromtimestamp(1004260000) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
>>> datetime.datetime.fromtimestamp(1004256400) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
+0

パーフェクト;ありがとう! (そしてそれは私のために働くことを確認しました) – dreeves

+0

['ut = lambda naive_utc_dt:(naive_utc_dt - datetime(1970,1,1)).total_seconds()'](http://stackoverflow.com/a/ 8778548/4279) – jfs

+0

@JFSebastian、答えとして追加したいですか?あなたが正しいと思うのですが(私はあなたのバージョンを確認していませんが)、あなたの答えはここで受け入れられるはずです。私は残念ながら、より良い方法を指しているコメントのリンクだけで後世を導きたくない! – dreeves

関連する問題