Bagaimana cara mengonversi string datetime di waktu lokal ke string di waktu UTC ?
Saya yakin saya pernah melakukan ini sebelumnya, tetapi tidak dapat menemukannya dan semoga SO akan membantu saya (dan yang lainnya) melakukannya di masa depan.
Klarifikasi : Misalnya, jika saya memiliki 2008-09-17 14:02:00
di zona waktu lokal saya ( +10
), saya ingin membuat string dengan UTC
waktu yang setara :2008-09-17 04:02:00
.
Juga, dari http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , perhatikan bahwa secara umum ini tidak mungkin karena dengan DST dan masalah lain tidak ada konversi unik dari waktu setempat ke Waktu UTC.
Jawaban:
Pertama, parsing string ke objek datetime yang naif. Ini adalah contoh
datetime.datetime
tanpa informasi zona waktu yang terlampir. Lihat dokumentasi untukdatetime.strptime
informasi tentang penguraian string tanggal.Gunakan
pytz
modul, yang dilengkapi dengan daftar zona waktu + UTC. Cari tahu apa zona waktu setempat, bangun objek zona waktu darinya, dan memanipulasi dan melampirkannya pada datetime yang naif.Terakhir, gunakan
datetime.astimezone()
metode untuk mengonversi datetime ke UTC.Kode sumber, menggunakan zona waktu lokal "America / Los_Angeles", untuk string "2001-2-3 10:11:12":
Dari sana, Anda dapat menggunakan
strftime()
metode untuk memformat datetime UTC sesuai kebutuhan:sumber
tzlocal.get_localzone()
untuk mendapatkan zona waktu lokal sebagaipytz
objek tzinfoFungsi utcnow () modul datetime dapat digunakan untuk mendapatkan waktu UTC saat ini.
Seperti tautan yang disebutkan di atas oleh Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ mengatakan:
CATATAN - Jika ada data Anda di wilayah yang menggunakan DST, gunakan
pytz
dan lihat jawaban John Millikin.Jika Anda ingin mendapatkan waktu UTC dari string yang diberikan dan keberuntungan Anda cukup untuk berada di wilayah di dunia yang tidak menggunakan DST, atau Anda memiliki data yang hanya offset dari UTC tanpa DST diterapkan:
-> menggunakan waktu lokal sebagai dasar untuk nilai offset:
-> Atau, dari offset yang diketahui, menggunakan datetime.timedelta ():
MEMPERBARUI:
Karena python 3.2
datetime.timezone
tersedia. Anda dapat menghasilkan objek datetime sadar zona waktu dengan perintah di bawah ini:Jika Anda siap untuk mengambil konversi zona waktu baca ini:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
sumber
tzinfo.utcoffset() must return a whole number of minutes
dan seterusnya.Terima kasih @rofly, konversi penuh dari string ke string adalah sebagai berikut:
Ringkasan saya tentang
time
/calendar
fungsi:time.strptime
string -> tuple (tidak ada zona waktu yang diterapkan, jadi cocok dengan string)
time.mktime
tuple waktu lokal -> detik sejak zaman (selalu waktu setempat)
time.gmtime
detik sejak zaman -> tuple dalam UTC
dan
calendar.timegm
tuple dalam UTC -> detik sejak zaman
time.localtime
detik sejak zaman -> tuple di zona waktu lokal
sumber
(always local time)
tampaknya salah: input ke mktime () adalah waktu lokal, output adalah detik sejak zaman (1970-01-01 00:00:00 +0000 (UTC)
) yang tidak tergantung pada zona waktu.Berikut ringkasan konversi waktu Python umum.
Beberapa metode menjatuhkan pecahan detik, dan ditandai dengan (s) . Formula eksplisit seperti
ts = (d - epoch) / unit
dapat digunakan sebagai gantinya (terima kasih jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(pengecualian selama transisi DST, lihat komentar dari jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(lihat komentar dari jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(pengecualian selama transisi DST, lihat komentar dari jfs)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(mungkin gagal dalam kondisi tertentu, lihat komentar dari jfs di bawah)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(tidak dapat mewakili detik kabisat, lihat komentar dari jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(tidak dapat mewakili detik kabisat, lihat komentar dari jfs)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(pengecualian selama transisi DST, lihat komentar dari jfs)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(mungkin gagal untuk zona waktu non-pytz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(tidak bisa mewakili detik kabisat, lihat komentar dari jfs)
stz.localize(dt, is_dst=None)
(pengecualian selama transisi DST, lihat komentar dari jfs)
dt.replace(tzinfo=UTC)
Sumber: taaviburns.ca
sumber
fromtimestamp(t, None)
mungkin gagal jika zona waktu lokal memiliki offset utc berbeda dit
dan pustaka C tidak memiliki akses ke database tz pada platform yang diberikan. Anda dapat menggunakantzlocal.get_localzone()
untuk menyediakan tzdata dengan cara yang portabel. (2)fromtimestamp(t, tz)
mungkin gagal untuk zona waktu non-pytz. (3)datetime(*struct_time[:6])
Anda hilang*
. (4)timegm()
,utctimetuple()
,struct_time
solusi berbasis menjatuhkan sepersekian detik. Anda bisa menggunakan rumus eksplisit seperti: sebagaits = (d - epoch) / unit
gantinya.stz.localize(dt, is_dst=None)
menimbulkan pengecualian untuk waktu lokal yang ambigu atau tidak ada misalnya, selama transisi DST. Untuk menghindari pengecualian, gunakanstz.normalize(stz.localize(dt))
yang dapat mengembalikan hasil yang tidak tepat. (6) datetime () tidak dapat mewakili lompatan kedua. Konversikanstruct_time
ke "detik sejak zaman" sebagai solusi pertama. (7)time.gmtime(t)
tidak seperticalendar.timegm()
dapat mengharapkan input non-POSIX jika zona waktu "benar" digunakan. Gunakan rumus eksplisit jika inputnya adalah POSIX:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
tag. Maaf. Ini disengaja dan dirancang. Jika Anda memerlukan" tabel "yang cepat dan kotor, gunakan<pre>
tata letak ASCII." Saya tidak percaya tabel ASCII akan lebih mudah dibaca daripada daftar di atas.Sumber: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Contoh penggunaan dari bd808 : Jika sumber Anda adalah
datetime.datetime
objekt
, panggil sebagai:sumber
t
, panggil sebagai: local_to_utc (t.timetuple ()).timetuple()
set panggilantm_isdst
ke-1
; ada kemungkinan 50%mktime()
gagal selama transisi DST.Saya beruntung dengan dateutil (yang direkomendasikan secara luas di SO untuk pertanyaan terkait lainnya):
(Kode diturunkan dari jawaban ini untuk Mengonversi string datetime UTC ke datetime lokal )
sumber
dateutil
dapat gagal untuk tanggal yang lalu jika zona waktu lokal memiliki offset utc yang berbeda maka (tidak terkait dengan transisi DST) pada sistem di mana implementasinya tidak menggunakan database zona waktu historis (terutama Windows).pytz
+tzlocal
bisa digunakan sebagai gantinya.Satu lagi contoh dengan pytz, tetapi termasuk localize (), yang menyelamatkan hari saya.
sumber
Saya sudah paling sukses dengan python-dateutil :
sumber
dateutil
dapat gagal untuk tanggal yang lalusumber
mktime(dt.timetuple())
dapat gagal selama transisi DST . AdaLocalTimezone
dalam dokumen (ini berfungsi untuk definisi zona waktu terbaru tetapi dapat gagal untuk tanggal yang lalu (tidak terkait dengan DST))jika Anda lebih suka datetime. waktu:
sumber
mktime()
mengharapkan waktu lokal sebagai input.fromtimestamp()
mengembalikan waktu setempat, bukan utc. Jika Anda memperbaikinya maka lihat masalahdateutil
Sederhana
Saya melakukannya seperti ini:
Implementasi yang Mewah
Jika Anda ingin menjadi mewah, Anda dapat mengubahnya menjadi functor:
Hasil:
sumber
Anda dapat melakukannya dengan:
sumber
Bagaimana tentang -
jika detik
None
maka itu mengubah waktu setempat ke UTC waktu lain mengkonversi waktu yang lewat ke UTC.sumber
Untuk menghemat waktu siang hari, dll.
Tidak ada jawaban di atas yang membantu saya. Kode di bawah ini berfungsi untuk GMT.
sumber
Menggunakan http://crsmithdev.com/arrow/
Perpustakaan ini memudahkan hidup :)
sumber
Saya menemukan jawaban terbaik untuk pertanyaan lain di sini . Ini hanya menggunakan python built-in libraries dan tidak mengharuskan Anda untuk memasukkan zona waktu lokal Anda (persyaratan dalam kasus saya)
Saya memposting ulang jawabannya di sini karena pertanyaan ini muncul di google alih-alih pertanyaan yang ditautkan tergantung pada kata kunci pencarian.
sumber
Saya memiliki kode ini di salah satu proyek saya:
sumber
Dalam python3:
pip install python-dateutil
sumber
from dateutil import tz
Bagaimana tentang -
jika detik
None
maka itu mengubah waktu setempat ke UTC waktu lain mengkonversi waktu yang lewat ke UTC.sumber