Mengapa python 2.7 doesn't seperti Z karakter (Zulu atau zero offset) pada akhir UTC datetime objek's isoformat string seperti JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Sedangkan di javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
isoformat()
Python's datetime
tidak mendukung militer zona waktu akhiran seperti 'Z' akhiran untuk UTC. Berikut string sederhana penggantian triknya:
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)
adalah pada dasarnya sama seperti d.isoformat(sep=' ')
Lihat: Datetime, Python Library Standar
strftime()
Atau anda bisa menggunakan strftime
untuk mencapai efek yang sama:
In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'
Catatan: opsi Ini hanya bekerja jika anda tahu tanggal yang ditentukan dalam UTC.
Lihat: datetime.strftime()
Pergi lebih jauh, anda mungkin akan tertarik dalam menampilkan dibaca manusia timezone informasi, pytz
dengan strftime
%Z
timezone bendera:
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
benda don't memiliki waktu zona info secara default, dan tanpa itu, Python benar-benar melanggar ISO 8601 spesifikasi (jika ada waktu zona info yang diberikan, diasumsikan waktu setempat). Anda dapat menggunakan pytz paket untuk mendapatkan beberapa default zona waktu, atau langsung subclass tzinfo
diri sendiri:
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
def tzname(self,**kwargs):
return "UTC"
def utcoffset(self, dt):
return timedelta(0)
Kemudian anda dapat secara manual menambahkan info zona waktu untuk utcnow()
:
>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'
Catatan bahwa ini TIDAK sesuai dengan format ISO 8601, yang memungkinkan untuk baik Z
atau +00:00
sebagai akhiran untuk UTC. Catatan yang terakhir benar-benar sesuai dengan standar yang lebih baik, dengan cara zona waktu yang diwakili secara umum (UTC adalah kasus khusus.)
Python datetimes sedikit kikuk. Gunakan panah
.
> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'
Panah memiliki dasarnya sama api sebagai datetime, tapi dengan zona waktu dan beberapa tambahan sopan santun yang harus di perpustakaan utama.
Format yang kompatibel dengan Javascript dapat dicapai dengan:
arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'
Javascript Tanggal.mengurai
diam-diam akan drop mikrodetik dari timestamp.
Berikut javascript dan python script memberikan identik output. Saya pikir itu's apa yang anda cari.
JavaScript
new Date().toISOString()
Python
import datetime
datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
Output yang mereka berikan adalah utc (zelda) waktu diformat sebagai ISO string dengan 3 milidetik signifikan digit dan ditambahkan dengan Z.
2019-01-19T23:20:25.459Z
Ada banyak jawaban yang baik pada posting, tapi saya ingin format untuk keluar persis seperti yang dilakukannya dengan JavaScript. Ini adalah apa yang saya'm menggunakan dan bekerja dengan baik.
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'
Dengan menggabungkan semua jawaban di atas saya datang dengan fungsi berikut :
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'
Atau, untuk mendapatkan itu dalam satu gerakan:
>>> zulu = "{}Z".format(arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS'))
>>> zulu
'2018-11-28T21:54:49.639Z'