web-dev-qa-db-ja.com

デフォルトのタイムゾーンを含むisoformat datetime文字列を取得する方法は?

Iso形式_yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE_と一致する時間文字列を生成する必要があります。 now()およびutcnow()クラスメソッドは、ほとんど私が望むことを行います。

_>>> import datetime
>>> #time adjusted for current timezone
>>> datetime.datetime.now().isoformat()
'2010-08-03T03:00:00.000000'
>>> #unadjusted UTC time
>>> datetime.datetime.utcnow().isoformat()
'2010-08-03T10:00:00.000000'
>>>
>>> #How can I do this?
>>> datetime.datetime.magic()
'2010-08-03T10:00:00.000000-07:00'
_
49
deft_code

Python 3.2+でUTCの現在時刻を取得するには:

_>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2015-01-27T05:57:31.399861+00:00'
_

Python 3.3+で現地時間を取得するには:

_>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().isoformat()
'2015-01-27T06:59:17.125448+01:00'
_

説明: datetime.now(timezone.utc) は、UTC時間でタイムゾーン対応のdatetimeオブジェクトを生成します。 astimezone() は、引数なしで呼び出された場合、datetimeオブジェクトのタイムゾーンをシステムのロケールタイムゾーンに変更します。タイムゾーン対応のdatetimeオブジェクトは、正しいISO形式を自動的に生成します。

75
jfs

日時オブジェクトをタイムゾーンに対応させる必要があります。 datetime docs から:

日時オブジェクトには、「単純」と「認識」の2種類があります。この区別は、オブジェクトにタイムゾーン、夏時間、またはその他の種類のアルゴリズム的または政治的な時間調整の概念があるかどうかを指します。単純な日時オブジェクトが協定世界時(UTC)、現地時間、または他のタイムゾーンの時間を表すかどうかは、特定の数値がメートル、マイル、または質量を表すかどうかはプログラム次第であるように、プログラム次第です。単純なdatetimeオブジェクトは、現実のいくつかの側面を無視するという犠牲を払って理解しやすく、扱いやすくなっています。

日時オブジェクトを認識している場合は、isoformat()を使用して必要な出力を取得できます。

日時オブジェクトを認識させるには、 ここの2番目の例のようなtzinfoのサブクラス 、またはより単純な- pytz のような、それを行うパッケージを使用する必要があります。または python-dateutil

Pytzを使用すると、これは次のようになります。

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()

'%z' format directive のようにstrftimeを使用する場合、出力形式を制御することもできます

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
34
Ofri Raviv

矢印 の場合:

>>> import arrow
>>> arrow.now().isoformat()
'2015-04-17T06:36:49.463207-05:00'
>>> arrow.utcnow().isoformat()
'2015-04-17T11:37:17.042330+00:00'
17
Wes Turner

Python 2.7+でpython-dateutil(デフォルトではMacにインストールされています)でそれを行うことができます:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> datetime.now(tzlocal()).isoformat()
'2016-10-22T12:45:45.353489-03:00'

または、既存の保存された文字列から変換する場合:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from dateutil.parser import parse
>>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
>>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)
3