web-dev-qa-db-ja.com

Python UTC datetimeオブジェクトのISO形式にはZ(Zuluまたはゼロオフセット)は含まれません

なぜpython 2.7には、JavaScriptとは異なり、UTC datetimeオブジェクトのisoformat文字列の最後にZ文字(Zuluまたはゼロオフセット)が含まれないのですか?

>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'

一方、javascriptでは

>>>  console.log(new Date().toISOString()); 
2013-10-29T09:38:41.341Z
75
Murali Mopuru

Python datetimeオブジェクトはデフォルトではタイムゾーン情報を持たず、それなしではPythonは実際にISO 8601仕様に違反します( タイムゾーン情報が指定されていない場合、現地時間 )。 pytzパッケージ を使用してデフォルトのタイムゾーンを取得するか、tzinfoを直接サブクラス化できます:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)

その後、タイムゾーン情報を手動でutcnow()に追加できます。

>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'

これはISO 8601形式に準拠しており、UTCのサフィックスとしてZまたは+00:00のいずれかを許可することに注意してください。後者は実際には標準によく準拠しており、タイムゾーンの一般的な表現方法に注意してください(UTCは特殊なケースです)。

38
stiv

オプション:isoformat()

Pythonのdatetimeは、UTCの 'Z'サフィックスなどの 軍事タイムゾーン サフィックスをサポートしていません。次の単純な文字列置換がトリックを行います。

In [1]: import datetime

In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)

In [3]: str(d).replace('+00:00', 'Z')
Out[3]: '2014-12-10 12:00:00Z'

str(d)は基本的にd.isoformat(sep=' ')と同じです

参照: 日時、Python標準ライブラリ

オプション:strftime()

または、strftimeを使用して同じ効果を得ることができます。

In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'

注:このオプションは、指定された日付がUTCであることがわかっている場合にのみ機能します。

参照: datetime.strftime()


追加:人間が読めるタイムゾーン

さらに、人間が読み取れるタイムゾーン情報を表示することに興味があるかもしれません。pytzstrftime%Z timezoneフラグ:

In [5]: import pytz

In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)

In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)

In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'
33
Manav Kataria

Pythonの日時は少し不格好です。 arrowを使用します。

> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'

Arrowは、基本的にdatetimeと同じAPIを持っていますが、メインライブラリにあるべきタイムゾーンといくつかの特別な機能を備えています。

Javascriptと互換性のある形式は、次の方法で実現できます。

arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'

Javascript Date.parseは、タイムスタンプから静かにマイクロ秒を削除します。

6
U2EF1

次のjavascriptおよびpythonスクリプトは、同一の出力を提供します。あなたが探しているものだと思います。

JavaScript

new Date().toISOString()

Python

import datetime

datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

出力される出力は、有効文字列が3ミリ秒のISO文字列としてフォーマットされ、Zが付加されたutc(ゼルダ)時間です。

2019-01-19T23:20:25.459Z
4
Jam Risser

Python> = 3.2では、これを簡単に使用できます。

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'
2
Michel Samia

投稿には多くの良い答えがありますが、JavaScriptの場合とまったく同じフォーマットが出てくるようにしたかったのです。これは私が使用しているものであり、うまく機能します。

In [1]: import datetime

In [1]: now = datetime.datetime.utcnow()

In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'
1
Michael Cox

上記のすべての答えを組み合わせることで、次の機能が付属しました:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)


def getdata(yy, mm, dd, h, m, s) :
    d = datetime(yy, mm, dd, h, m, s)
    d = d.replace(tzinfo=simple_utc()).isoformat()
    d = str(d).replace('+00:00', 'Z')
    return d


print getdata(2018, 02, 03, 15, 0, 14)
1
EmptyData
pip install python-dateutil
>>> a = "2019-06-27T02:14:49.443814497Z"
>>> dateutil.parser.parse(a)
datetime.datetime(2019, 6, 27, 2, 14, 49, 443814, tzinfo=tzutc())
1
W Yg