web-dev-qa-db-ja.com

strftimeを使ってPythonのdatetimeをEpochに変換する

UTCで、エポックからの経過秒数を求めます。

私はそれを秒数に変換するためにstrftimeを使っています。例として2012年4月1日を取ります。

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

2012年4月1日のEpochからのUTCは1333238400ですが、これは1333234800を返します。これは1時間異なります。

つまり、strftimeは私のシステム時間を考慮に入れ、タイムゾーンシフトをどこかに適用しているようです。 datetimeは純粋に単純なものだと思いましたか?

どうすればそれを回避できますか?可能であれば、標準以外のライブラリをインポートしないようにします。 (私は移植性の問題を抱えています)。

167
Noel

もしあなたがPythonの日時をEpochからの秒数に変換したいのであれば、明示的にそれを行うことができます。

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

Python 3.3以降では、代わりに timestamp() を使用できます。

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

なぜdatetime.strftime('%s')を使うべきではないのか

Pythonは実際にはstrftimeの引数として%sをサポートしていません( http://docs.python.org/library/datetime.html#strftime-and-strptime-behaviorをチェックした場合) これはリストには含まれていません。これが機能する唯一の理由は、Pythonがローカルのタイムゾーンを使用するシステムのstrftimeに情報を渡すためです。

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
315
jleahy

私はタイムゾーンなどで深刻な問題を抱えていました。 Pythonがすべてを処理する方法は、(私にとって)かなり混乱を招くことがあります。 calendarモジュールを使うとうまくいっているようです(links 123 および 4 )。

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
91
BorrajaX
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
31
srossross
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(すみません、それは私が既存の答えについてコメントさせないでしょう)

14
Charles Plager

あなたがちょうどunix/Epoch時間にタイムスタンプを必要とするならば、この1行は働きます:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

そしてpython2とpython3のdatetimeの動作にのみ依存します

3
Marc Maxmeister

これはPython 2と3で動作します。

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

公式ドキュメントに従ってください... https://docs.python.org/2/library/time.html#module-time

2
Luis Pollo

Python 3.7では

Date.isoformat()およびdatetime.isoformat()によって発行されたフォーマットの1つでdate_stringに対応するdatetimeを返します。具体的には、この関数はYYYY-MM-DD [* HH [:MM [:SS [.fff [fff]]]] [+ HH:MM [:SS [.ffffff]]]]という形式の文字列をサポートします。 *は任意の1文字と一致します。

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

0
SuperNova

時間帯に依存しない明示的な解決策については、pytzライブラリを使用してください。

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

出力(フロート):1333238400.0

0
Moobie