なぜ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
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は特殊なケースです)。
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であることがわかっている場合にのみ機能します。
さらに、人間が読み取れるタイムゾーン情報を表示することに興味があるかもしれません。pytz
strftime
%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'
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
は、タイムスタンプから静かにマイクロ秒を削除します。
次の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
Python> = 3.2では、これを簡単に使用できます。
>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'
投稿には多くの良い答えがありますが、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'
上記のすべての答えを組み合わせることで、次の機能が付属しました:
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)
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())