Mengapa python 2.7 tidak menyertakan karakter Z (Zulu atau nol offset) di akhir string isoformat objek waktu UTC tidak 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
datetime.datetime.utcnow().isoformat() + 'Z'
Jawaban:
datetime
Objek Python tidak memiliki info zona waktu secara default, dan tanpanya, Python sebenarnya melanggar spesifikasi ISO 8601 ( jika tidak ada info zona waktu yang diberikan, diasumsikan sebagai waktu lokal ). Anda dapat menggunakan paket pytz untuk mendapatkan beberapa zona waktu default, atau langsung membuat subkelastzinfo
Anda sendiri:Kemudian Anda dapat menambahkan info zona waktu secara manual ke
utcnow()
:Perhatikan bahwa ini TIDAK sesuai dengan format ISO 8601, yang memungkinkan salah satu
Z
atau+00:00
sebagai sufiks untuk UTC. Perhatikan bahwa yang terakhir sebenarnya lebih sesuai dengan standar, dengan bagaimana zona waktu direpresentasikan secara umum (UTC adalah kasus khusus.)sumber
Z
bukan+00:00
?pytz
melanggartzinfo
protokol Python dan berbahaya untuk digunakan! Lihat blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
untuk bekerja tidak diimplementasikan hingga Python 3.6 dengan PEP 495, jadi mengatakanpytz
tidak menggunakan antarmuka standar tidak adil karena antarmuka berubah. Sebelum perubahan, satu-satunya cara untuk membuatnya berhasil adalah denganpytz
melakukannya.Pilihan:
isoformat()
Python
datetime
tidak mendukung sufiks zona waktu militer seperti akhiran 'Z' untuk UTC. Penggantian string sederhana berikut berhasil:str(d)
pada dasarnya sama dengand.isoformat(sep=' ')
Lihat: Datetime, Python Standard Library
Pilihan:
strftime()
Atau Anda bisa menggunakan
strftime
untuk mencapai efek yang sama:Catatan: Opsi ini hanya berfungsi jika Anda mengetahui tanggal yang ditentukan dalam UTC.
Lihat: datetime.strftime ()
Tambahan: Zona Waktu yang Dapat Dibaca Manusia
Lebih jauh lagi, Anda mungkin tertarik untuk menampilkan informasi zona waktu yang dapat dibaca manusia,
pytz
denganstrftime
%Z
bendera zona waktu:sumber
T
kosong?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
di baris 2. Btw., di RFC3339 dikatakan bahwa spasi adalah 'ok' (bukan 'T').Skrip javascript dan python berikut memberikan keluaran yang identik. Saya pikir itu yang Anda cari.
JavaScript
Python
Output yang mereka berikan adalah waktu utc (zelda) yang diformat sebagai string ISO dengan digit signifikan 3 milidetik dan ditambahkan dengan Z.
sumber
Dengan Python> = 3.2 Anda cukup menggunakan ini:
sumber
Z
, Anda dapat memotong offsetnya:.isoformat()[:-6] + 'Z'
Waktu data Python agak kikuk. Gunakan
arrow
.Arrow pada dasarnya memiliki api yang sama dengan datetime, tetapi dengan zona waktu dan beberapa kenyamanan tambahan yang harus ada di perpustakaan utama.
Format yang kompatibel dengan Javascript dapat dicapai dengan:
Javascript
Date.parse
akan melepaskan mikrodetik secara diam-diam dari stempel waktu.sumber
Ada banyak jawaban bagus di posting, tapi saya ingin formatnya keluar persis seperti pada JavaScript. Inilah yang saya gunakan dan berfungsi dengan baik.
sumber
sumber
Saya mendekati masalah ini dengan beberapa tujuan:
timezone
fungsi utilitas Django dandateutil
parserPendekatan ini tidak menyertakan sufiks Z dan tidak digunakan
utcnow()
, tetapi didasarkan pada rekomendasi dalam dokumentasi Python dan lolos dikumpulkan dengan Django dan JavaScript.Mari kita mulai dengan meneruskan objek zona waktu UTC
datetime.now()
daripada menggunakandatetime.utcnow()
:Itu terlihat baik, jadi mari kita lihat apa yang Django dan
dateutil
berpikir:Oke, objek tanggal waktu Python dan string ISO 8601 adalah UTC "aware". Sekarang mari kita lihat apa yang JavaScript pikirkan tentang string datetime. Meminjam dari jawaban ini kita mendapatkan:
Anda mungkin juga ingin membaca posting blog ini .
sumber
Dengan menggabungkan semua jawaban di atas saya datang dengan fungsi berikut:
sumber
Saya menggunakan pendulum:
sumber
Atau, untuk mendapatkannya dalam satu gerakan:
sumber