Python UTC datetime オブジェクトの ISO 形式に Z が含まれていない。

なぜ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
質問へのコメント (4)

オプション: isoformat()

Python の datetime は 'Z' のような military timezone 接尾辞をサポートしていません。以下のような単純な文字列置換で対応できます:

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=' ')`と同じです。

を参照してください:Datetime、Python標準ライブラリを参照してください。

オプション: strftime().

あるいは strftime を使っても同じ効果が得られます:

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

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

参照してください:datetime.strftime() を参照してください。


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

さらに進んで、人間が読めるタイムゾーン情報を表示することに興味があるかもしれない:

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=)

In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'
解説 (2)
ソリューション

Python の datetime オブジェクトはデフォルトではタイムゾーンの情報を持っていません。タイムゾーンの情報がないと、Python は ISO 8601 の仕様に違反してしまいます(if no time zone info is given, assumed to be local time)。pytzパッケージ](https://pypi.python.org/pypi/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は特別なケースです。)

解説 (4)

Pythonのdatetimeは少し不便だ。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 はタイムスタンプからマイクロ秒を削除します。

解説 (2)

次の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(zelda)時間です。

2019-01-19T23:20:25.459Z
解説 (0)

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

日時インポート日時、タイムゾーンから。 datetime.now(timezone.utc).isoformat()。 '2019-03-14T07:55:36.979511 + 00:00'。 ``。

解説 (1)

投稿には多くの良い答えがありますが、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'
解説 (0)

。 pipはpython-dateutilをインストールします。 。 ``。

a = "2019-06-27T02:14:49.443814497Z"。 dateutil.parser.parse(a)。 datetime.datetime(2019、6、27、2、14、49、443814、tzinfo = tzutc())。 ``。

解説 (0)

上記のすべての回答を組み合わせることで、次の機能が生まれました。

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)
解説 (0)

私は振り子を使います:

import pendulum

d = pendulum.now("UTC").to_iso8601_string()
print(d)

>>> 2019-10-30T00:11:21.818265Z
解説 (0)
>>> import arrow

>>> now = arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS')
>>> now
'2018-11-28T21:34:59.235'
>>> zulu = "{}Z".format(now)
>>> zulu
'2018-11-28T21:34:59.235Z'

または、一挙にそれを取得するために:

>>> zulu = "{}Z".format(arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS'))
>>> zulu
'2018-11-28T21:54:49.639Z'
解説 (0)