datetime.datetime.utcnow()
Mengapa ini datetime
tidak memiliki info zona waktu mengingat bahwa itu adalah UTC secara eksplisit datetime
?
Saya berharap ini akan mengandung tzinfo
.
datetime.datetime.utcnow()
Mengapa ini datetime
tidak memiliki info zona waktu mengingat bahwa itu adalah UTC secara eksplisit datetime
?
Saya berharap ini akan mengandung tzinfo
.
Jawaban:
Itu berarti zona waktu itu naif, jadi Anda tidak bisa menggunakannya datetime.astimezone
Anda bisa memberikan zona waktu seperti ini
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
sekarang Anda dapat mengubah zona waktu
print(u.astimezone(pytz.timezone("America/New_York")))
Untuk mendapatkan waktu saat ini di zona waktu tertentu, Anda bisa mengirimkan tzinfo ke datetime.now()
langsung:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Ia bekerja untuk zona waktu apa pun termasuk yang mengamati daylight saving time (DST) yaitu, ia bekerja untuk zona waktu yang mungkin memiliki offset utc yang berbeda pada waktu yang berbeda (offset utc yang tidak tetap). Jangan gunakan tz.localize(datetime.now())
- ini mungkin gagal selama transisi akhir-DST ketika waktu setempat ambigu.
astimezone
. Jadi datetime tidak hanya tidak memiliki zona waktu asli, tetapi satu-satunya implementasi tzinfo yang tersedia secara luas adalah tidak sesuai dengan standar yang seharusnya.
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
; gunakan datetime.now(tz)
saja.
Perhatikan bahwa untuk Python 3.2 dan seterusnya, datetime
modul berisi datetime.timezone
. Dokumentasi untuk datetime.utcnow()
mengatakan:
Datetime UTC terkini yang sadar dapat diperoleh dengan menelepon .
datetime.now
(
timezone.utc
)
Jadi kamu bisa melakukan:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
atau datetime.utcnow(timezone.utc)
?
datetime.utcnow()
tidak membutuhkan argumen. Jadi harus begitu datetime.now(timezone.utc)
.
datetime.now()
akan mengembalikan waktu mesin tetapi datetime.utcnow()
akan mengembalikan waktu UTC yang sebenarnya.
datetime.utcnow()
tidak disetel tzinfo
untuk menunjukkan bahwa itu UTC. Tetapi datetime.now(datetime.timezone.utc)
mengembalikan waktu UTC dengan tzinfo
set.
tz
objek di konstruktor sekarang, ia akan mengembalikan waktu zona waktu itu? Baik! Terima kasih telah menunjukkan.
Pustaka Python standar tidak menyertakan kelas tzinfo (tetapi lihat pep 431 ). Saya hanya bisa menebak alasannya. Secara pribadi saya pikir itu adalah kesalahan untuk tidak memasukkan kelas tzinfo untuk UTC, karena yang satu itu cukup tidak kontroversial untuk memiliki implementasi standar.
Sunting: Meskipun tidak ada implementasi di perpustakaan, ada satu yang diberikan sebagai contoh dalam tzinfo
dokumentasi .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Untuk menggunakannya, untuk mendapatkan waktu saat ini sebagai objek datetime sadar:
from datetime import datetime
now = datetime.now(utc)
Ada datetime.timezone.utc
dalam Python 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
objek yang dibuat oleh utcnow()
) ...
timezone.utc
akhirnya telah ditambahkan ke Python 3.2. Untuk kompatibilitas mundur, utcnow()
masih mengembalikan objek waktu kurang zona, tetapi Anda bisa mendapatkan apa yang Anda inginkan dengan menelepon now(timezone.utc)
.
struct
modul akan melakukan konversi otomatis dari Unicode ke bytestring, dan keputusan terakhir adalah untuk memutus kompatibilitas dengan versi Python 3 sebelumnya untuk mencegah keputusan buruk dari maju.
tzinfo
dokumentasi Python termasuk contoh kode untuk mengimplementasikannya, tetapi mereka tidak memasukkan fungsi itu dalam datetime itu sendiri! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
adalah sumber yang bagus. Pada saat saya mengedit jawaban saya untuk dimasukkan ke dalam kode contoh, orang lain telah menyarankannya dan saya tidak ingin mencuri guntur mereka.
The pytz
Modul adalah salah satu pilihan, dan ada lagi python-dateutil
, yang meskipun juga paket pihak ketiga, mungkin sudah tersedia, tergantung pada dependensi lain dan sistem operasi.
Saya hanya ingin memasukkan metodologi ini untuk referensi - jika Anda sudah menginstal python-dateutil
untuk tujuan lain, Anda dapat menggunakannya tzinfo
daripada menduplikasipytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
Saya cenderung setuju bahwa panggilan utcnow
harus mencakup informasi zona waktu UTC. Saya menduga bahwa ini tidak termasuk karena pustaka datetime bawaan default ke naet data untuk kompatibilitas lintas.
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
itu selalu berhasil; datetime.now(dateutil.tz.tzlocal())
mungkin gagal selama transisi DST . PEP 495 - Disambiguasi Waktu Lokal dapat memperbaiki dateutil
situasi di masa depan.
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(catatan: dateutil
dengan utc non-fixed offset (seperti dateutil.tz.tzlocal()
) mungkin gagal di sini , menggunakan sebuah pytz
solusi berbasis gantinya ).
dateutil
untuk dateutil.parser
, aku suka solusi ini yang terbaik. Itu yang sederhana seperti: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
. Biola!!
Julien Danjou menulis artikel bagus yang menjelaskan mengapa Anda tidak boleh berurusan dengan zona waktu . Kutipan:
Memang, API datetime Python selalu mengembalikan objek datetime yang tidak disadari, yang sangat disayangkan. Memang, begitu Anda mendapatkan salah satu objek ini, tidak ada cara untuk mengetahui zona waktu itu, oleh karena itu objek-objek ini cukup "tidak berguna" sendiri.
Sayangnya, meskipun Anda dapat menggunakan utcnow()
, Anda masih tidak akan melihat info zona waktu, seperti yang Anda temukan.
Rekomendasi:
Selalu gunakan
datetime
objek sadar , yaitu dengan informasi zona waktu. Itu memastikan Anda dapat membandingkannya secara langsung (objek sadar dan tidak sadardatetime
tidak sebanding) dan akan mengembalikannya dengan benar kepada pengguna. Leverage pytz untuk memiliki objek zona waktu.Gunakan ISO 8601 sebagai format string input dan output. Gunakan
datetime.datetime.isoformat()
untuk mengembalikan cap waktu sebagai string yang diformat menggunakan format itu, yang mencakup informasi zona waktu.Jika Anda perlu mengurai string yang berisi cap waktu berformat ISO 8601, Anda dapat mengandalkan
iso8601
, yang mengembalikan cap waktu dengan informasi zona waktu yang benar. Ini membuat cap waktu secara langsung dapat dibandingkan.
Untuk menambahkan timezone
informasi dalam Python 3.2+
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
Python 2.7.13 (default, 19 Jan 2017, 14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
Tanggal UTC tidak memerlukan info zona waktu karena itu UTC, yang menurut definisi berarti mereka tidak memiliki offset.
pytz.utc
). Perhatikan bahwa ada perbedaan besar antara nilai yang offsetnya dari UTC tidak diketahui dan nilai di mana nilai itu dikenal sebagai 0. Yang terakhir adalah yang utcnow()
harus dikembalikan, IMO. Itu akan cocok dengan "Objek sadar digunakan untuk mewakili momen tertentu dalam waktu yang tidak terbuka untuk interpretasi" sesuai dokumentasi.