Saya punya contoh python datetime yang dibuat menggunakan datetime.utcnow () dan bertahan di database.
Untuk tampilan, saya ingin mengonversi instance datetime yang diambil dari database ke datetime lokal menggunakan zona waktu lokal default (yaitu, seolah-olah datetime dibuat menggunakan datetime.now ()).
Bagaimana saya bisa mengubah datetime UTC ke datetime lokal hanya menggunakan pustaka standar python (mis., Tidak ada ketergantungan pytz)?
Tampaknya salah satu solusinya adalah menggunakan datetime.astimezone (tz), tetapi bagaimana Anda mendapatkan zona waktu lokal default?
python
datetime
timezone
python-datetime
Nitro Zark
sumber
sumber
Jawaban:
Dengan Python 3.3+:
Dalam Python 2/3:
Menggunakan
pytz
(keduanya Python 2/3):Contoh
Keluaran
Python 3.3 Python 2 pytzCatatan: memperhitungkan DST dan perubahan utc offset terbaru untuk zona waktu MSK.
Saya tidak tahu apakah solusi non-pytz bekerja di Windows.
sumber
.normalize()
karena zona waktu sumber.astimezone()
adalah UTC.TypeError: replace() takes no keyword arguments
ketika mencoba solusi pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Anda tidak dapat melakukannya hanya dengan perpustakaan standar karena perpustakaan standar tidak memiliki zona waktu. Anda membutuhkan pytz atau dateutil .
Atau, Anda dapat melakukannya tanpa pytz atau dateutil dengan menerapkan zona waktu Anda sendiri. Tapi itu konyol.
sumber
Anda tidak dapat melakukannya dengan perpustakaan standar. Menggunakan modul pytz Anda dapat mengonversi objek datetime naif / sadar ke zona waktu lainnya. Mari kita lihat beberapa contoh menggunakan Python 3.
Untuk mengonversi objek naif ke zona waktu lainnya, pertama-tama Anda harus mengubahnya menjadi objek sadar waktu. Anda bisa menggunakan
replace
metode untuk mengonversi objek datetime naif ke objek datetime sadar . Kemudian untuk mengonversi objek datetime sadar ke zona waktu lain, Anda dapat menggunakanastimezone
metode.Variabel
pytz.all_timezones
memberi Anda daftar semua zona waktu yang tersedia di modul pytz.Karena
now
metode mengembalikan tanggal dan waktu saat ini, jadi Anda harus membuat zona waktu objek datetime disadari terlebih dahulu. Thelocalize
fungsi mengkonversi naif objek datetime menjadi objek datetime zona-sadar. Kemudian Anda dapat menggunakanastimezone
metode ini untuk mengubahnya menjadi zona waktu lain.sumber
Saya pikir saya sudah mengetahuinya: menghitung jumlah detik sejak zaman, kemudian mengkonversi ke timzeone lokal menggunakan time.localtime, dan kemudian mengubah struct waktu kembali menjadi datetime ...
Ini menerapkan DST musim panas / musim dingin dengan benar:
sumber
utctotimestamp(utc_dt) -> (seconds, microseconds)
dari kode Anda untuk kejelasan, lihat implementasi Python 2.6-3.xMembangun komentar Alexei. Ini harus bekerja untuk DST juga.
sumber
Pustaka Python standar tidak datang dengan
tzinfo
implementasi sama sekali. Saya selalu menganggap ini sebagai kekurangan mengejutkan dari modul datetime.The dokumentasi untuk kelas tzinfo tidak datang dengan beberapa contoh yang berguna. Cari blok kode besar di bagian akhir.
sumber
os
modul bisa memberikan satu untuk waktu setempat berdasarkan fungsi sistem operasi.Python 3.9 menambahkan
zoneinfo
modul sehingga sekarang dapat dilakukan sebagai berikut (hanya stdlib):Eropa Tengah adalah 1 atau 2 jam lebih awal dari UTC, demikian
local_aware
juga:sebagai
str
:Windows tidak memiliki basis data zona waktu sistem, jadi di sini diperlukan paket tambahan:
Ada backport yang memungkinkan penggunaan dalam Python 3.6 hingga 3.8 :
Kemudian:
sumber
zoneinfo
sini - lihat bagian pertama dari jawaban jfs (bagian Python3.3 +) ;-)ZoneInfo('localtime')
jauh lebih jelas daripadatz=None
(setelah semua, orang mungkin berharaptz=None
untuk menghapus zona waktu atau mengembalikan UTC daripada waktu lokal).Cara sederhana (tapi mungkin cacat) yang bekerja di Python 2 dan 3:
Keuntungannya adalah sepele untuk menulis fungsi terbalik
sumber
time.timezone
tidak mempertimbangkan penghematan siang hari.Cara termudah yang saya temukan adalah mendapatkan waktu offset di mana Anda berada, kemudian kurangi dari jam tersebut.
Ini berfungsi untuk saya, dalam Python 3.5.2.
sumber
Berikut adalah cara lain untuk mengubah zona waktu dalam format datetime (saya tahu saya membuang energi untuk ini, tetapi saya tidak melihat halaman ini jadi saya tidak tahu caranya) tanpa min. dan dtk. karena saya tidak membutuhkannya untuk proyek saya:
sumber
Ini adalah cara yang mengerikan untuk melakukannya tetapi tidak membuat definisi. Memenuhi persyaratan untuk tetap dengan perpustakaan Python3 dasar.
sumber
Gunakan timedelta untuk beralih di antara zona waktu. Yang Anda butuhkan hanyalah offset dalam jam di antara zona waktu. Tidak harus mengutak-atik batas untuk semua 6 elemen dari objek datetime. timedelta menangani tahun kabisat, abad kabisat, dll, juga, dengan mudah. Anda harus terlebih dahulu
Maka jika
offset
zona waktu delta dalam jam:timeout = timein + timedelta(hours = offset)
di mana timein dan timeout adalah objek datetime. misalnya
timein + timedelta(hours = -8)
mengkonversi dari GMT ke PST.
Lantas, bagaimana cara menentukannya
offset
? Ini adalah fungsi sederhana asalkan Anda hanya memiliki beberapa kemungkinan untuk konversi tanpa menggunakan objek waktu-waktu yang "sadar" zona waktu yang dilakukan dengan baik oleh beberapa jawaban lain. Sedikit manual, tetapi terkadang kejelasan yang terbaik.Setelah melihat banyak jawaban dan bermain-main dengan kode paling ketat yang dapat saya pikirkan (untuk saat ini) tampaknya yang terbaik bahwa semua aplikasi, di mana waktu adalah penting dan zona waktu campuran harus diperhitungkan, harus melakukan upaya nyata untuk membuat semua objek waktu "sadar". Maka tampaknya jawaban yang paling sederhana adalah:
untuk mengkonversi ke GMT misalnya. Tentu saja, untuk mengkonversi ke / dari zona waktu lain yang Anda inginkan, lokal atau sebaliknya, cukup gunakan string zona waktu yang sesuai dengan pytz (dari pytz.all_timezones). Waktu musim panas juga diperhitungkan.
sumber