web-dev-qa-db-ja.com

Python datetimeオブジェクトをUTCに変換するにはどうすればよいですか?

私はpython UTCオブジェクトに変換したいdatetimeオブジェクトを持っています。HTTPヘッダーに入れるためにRFC 2822形式で出力することを計画していますが、それが重要かどうかはわかりませんこのサイトで時間オブジェクトの変換に関する情報を見つけましたが、その方が簡単に見えますが、今回はtimedeltaを使用して調整するため、実際にはdatetimeオブジェクトを使用します。

私はこのようなものを試しました:

from datetime import datetime, timedelta

now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???

Timeまたはdatetimeモジュールの何も、私を助けてくれるようには見えません。 datetimeオブジェクトを3つまたは4つの関数に渡すことでできるように思えますが、もっと簡単な方法があるのではないかと思っています。

サードパーティのモジュールを使用したくないが、それが唯一の合理的な選択である場合があります。

42
Elias Zamaria
from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)
31
Senyai

まず、tzinfoメンバーを設定して、datetimeがタイムゾーン対応オブジェクトであることを確認する必要があります。

http://docs.python.org/library/datetime.html#datetime.tzinfo

その後、.astimezone()関数を使用して変換できます。

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

9
Amber

UNIXエポック以降、datetimeオブジェクトをUTC秒に変換する方法を探している人のために:

import time
import datetime

t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())
5
ishmael

Python 2および3の両方で動作するstdlibソリューション(サードパーティモジュールなし).

RFC 2822形式で現在のUTC時間を取得するには:

>>> from email.utils import formatdate
>>> formatdate(usegmt=True)
'Fri, 27 Mar 2015 08:29:20 GMT'

5時間後のUTC時間を取得するには:

#!/usr/bin/env python
import time
from email.utils import formatdate

print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future
# -> Fri, 27 Mar 2015 08:34:20 GMT
2
jfs

日付文字列からUTCに変換するには:

from time import mktime
from datetime import datetime

mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))
2
ElaineN

Email.Utilsモジュールでformatdateメソッドを次のように使用できます

>>> from email.Utils import formatdate
>>> print formatdate()
Sun, 25 Jul 2010 04:02:52 -0000

上記は、RFC 2822形式の日時です。デフォルトではUTC時間を返しますが、現地時間が必要な場合はformatdate(localtime = True)を呼び出すことができます。

詳細については、 http://docs.python.org/library/email.mime.html#module-email.util を確認してください。

2
GeekTantra

現在の時刻を取得し、timedeltaオブジェクトを追加して、結果をUTCに変換し、RFC 2822で出力する方法を見つけました。

_time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
    time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))
_

これは私の質問に正確には答えませんでしたが、私の状況で他の誰かを助けるかもしれないので、私はそれをここに置いています。

編集:タイムデルタが1日未満の場合にのみこのトリックが機能することを付け加えます。何らかのタイムデルタ値で動作するものが必要な場合は、timedelta.total_seconds()(Python 2.7以降)の場合、または_86400*timedelta.days + timedelta.seconds_を使用できます。実際にこれを試したわけではないので、うまくいくかどうかは100%確信できません。

2
Elias Zamaria

solutionwithfantasticDelorean lib

>>> import datetime
>>> import delorean
>>> dt = datetime.datetime.now()
>>> dl = delorean.Delorean(dt, timezone='US/Pacific')
>>> dl.shift('UTC')
Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC)

>>> dl.shift('UTC').datetime
datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>)

>>> dl.shift('EST').datetime
datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>)

異なるタイムゾーン間で日付時刻を簡単にシフトできます

1
DmitrySemenov