なぜ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
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=<UTC>)
In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'
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は特別なケースです。)
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
はタイムスタンプからマイクロ秒を削除します。
次の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
投稿には多くの良い答えがありますが、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)
>>> 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'