Sangat lucu bagaimana "GMT", "GMT + 0", "GMT-0", "GMT0", "Greenwich", "UCT", "UTC", "Universal", dan "Zulu" pada dasarnya berarti hal yang sama dan namun ada begitu banyak entri untuk itu.
Joe Z.
43
GMT tidak sama dengan UTC. Itu kesalahan umum.
PawelRoman
1
@PawelRoman: GMT dapat berarti berbagai hal dalam konteks yang berbeda. Ini tidak berarti UTC kadang-kadang misalnya, sertifikat ssl waktu string seperti diterima membutuhkan GMT ( warisan). ssl.cert_time_to_second()ASN1_TIME_print()
jfs
3
@ PamelaRoman Anda benar dalam arti bahwa satu adalah zona waktu, dan yang lainnya adalah standar. Namun dalam arti praktis yang dipikirkan kebanyakan orang, keduanya merujuk pada saat yang sama.
China menggunakan zona waktu tunggal , yang namanya zona waktu 'Asia/Shanghai'.
unutbu
1
Ungkapan ini menunjukkan hasil mengerikan yang dapat diberikan pytz: (datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()(hasilnya bukan -28800). Saya akan menghindari pytz—dateutil.tz menyediakan fungsionalitas yang serupa tetapi menggunakan database zona waktu OS dan tidak memiliki masalah seperti itu.
Yongwei Wu
2
@YongweiWu ini adalah penggunaan API yang salah. Anda tidak boleh melewati zona waktu pytz dengan offset utc yang tidak tetap sebagai argumen tzinfo secara langsung. Gunakan metode .localize () seperti yang disarankan pytz docs.
jfs
38
Jangan buat daftar Anda sendiri - pytzmemiliki set bawaan:
Atau jika Anda sudah memiliki datetimeobjek yang sadar TZ (tidak naif):
# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)>>> new_ct.isoformat()2017-01-13T11:29:22.601991-05:00
Nama zona waktu adalah satu-satunya cara yang dapat diandalkan untuk menentukan zona waktu.
Anda dapat menemukan daftar nama zona waktu di sini: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Perhatikan bahwa daftar ini berisi banyak nama alias, seperti AS / Timur untuk zona waktu yang benar-benar disebut Amerika / New_York.
Jika Anda secara terprogram ingin membuat daftar ini dari basis data zoneinfo, Anda dapat mengompilasinya dari file zone.tab di basis data zoneinfo. Saya tidak berpikir pytz memiliki API untuk mendapatkannya, dan saya juga tidak berpikir itu akan sangat berguna.
pytzmenyediakan akses ke basis data tz (ini adalah sumber untuk data wikipedia).
jfs
4
EDIT: Saya akan sangat menghargainya jika Anda tidak mengundurkan diri jawaban ini lebih lanjut. Jawaban ini salah , tetapi saya lebih suka mempertahankannya sebagai catatan sejarah. Meskipun dapat diperdebatkan apakah antarmuka pytz rawan kesalahan, ia dapat melakukan hal-hal yang tidak dapat dilakukan dateutil.tz, terutama mengenai penghematan cahaya matahari di masa lalu atau di masa depan. Saya jujur mencatat pengalaman saya dalam sebuah artikel "Zona waktu dengan Python" .
Jika Anda menggunakan platform seperti Unix, saya sarankan Anda menghindari pytz dan lihat saja di / usr / share / zoneinfo. dateutil.tz dapat memanfaatkan informasi di sana.
Sepotong kode berikut menunjukkan masalah yang dapat diberikan pytz. Saya terkejut ketika saya pertama kali mengetahuinya. (Cukup menarik, pytz yang diinstal oleh yum pada CentOS 7 tidak menunjukkan masalah ini.)
Yaitu zona waktu yang dibuat oleh pytz adalah untuk waktu lokal yang sebenarnya, bukan standar waktu setempat yang diamati orang. Shanghai sesuai dengan +0800, bukan +0806 seperti yang disarankan oleh pytz:
EDIT: Terima kasih atas komentar dan downvote Mark Ransom, sekarang saya tahu saya menggunakan pytz dengan cara yang salah. Singkatnya, Anda tidak seharusnya meneruskan hasil dari pytz.timezone(…)ke datetime, tetapi harus meneruskan datetimeke localizemetodenya.
Terlepas dari argumennya (dan kesalahan saya karena tidak membaca dokumentasi pytz lebih hati-hati), saya akan menyimpan jawaban ini. Saya menjawab pertanyaan dengan satu cara (bagaimana menghitung zona waktu yang didukung, meskipun tidak dengan pytz), karena saya percaya pytz tidak memberikan solusi yang benar. Meskipun kepercayaan saya salah, jawaban ini masih memberikan beberapa informasi, IMHO, yang berpotensi bermanfaat bagi orang yang tertarik pada pertanyaan ini. Cara Pytz yang benar dalam melakukan sesuatu adalah kontra-intuitif. Heck, jika tzinfo yang dibuat oleh pytz tidak boleh langsung digunakan datetime, itu harus tipe yang berbeda. Antarmuka pytz dirancang dengan buruk. Tautan yang diberikan oleh Mark menunjukkan bahwa banyak orang, bukan hanya saya, telah disesatkan oleh antarmuka pytz.
Lihat stackoverflow.com/questions/11473721/… untuk perbaikannya. Tidak ada yang salah dengan itu pytz, Anda hanya salah menggunakannya. PS Ini bukan jawaban untuk pertanyaan sama sekali .
Mark Ransom
1
@MarkRansom Info bagus, dan senang mengetahuinya. Namun, saya tidak membeli argumen Anda. Antarmuka dirancang salah, titik. Ini sangat berlawanan dengan intuisi.
Yongwei Wu
3
Ya, antarmuka dirancang salah. Tapi itu datetimeantarmuka yang salah, bukan pytz. datetimetidak mengantisipasi objek zona waktu yang cerdas , sehingga antarmuka tidak menginisialisasi dengan benar.
Mark Ransom
1
Dengan hormat, saya tidak setuju. datetimeadalah bagian dari pustaka Python standar, dan itu adalah pytz yang harus mengikuti datetimeantarmuka, bukan sebaliknya. Jika ada yang bisa mengimplementasikan beberapa antarmuka dengan cara mereka berpikir lebih baik tanpa konsensus, tidak akan ada perangkat lunak yang kuat.
Yongwei Wu
2
Seperti yang saya katakan, pytztidak dapat mengikuti datetimeantarmuka karena datetimeantarmuka kurang. Para penulis antarmuka itu tidak mengantisipasi masalah zona waktu yang parameternya berubah selama bertahun-tahun. Hanya karena itu bagian dari distribusi Python standar tidak berarti itu sempurna.
Mark Ransom
-8
Menurut pendapat saya ini adalah cacat desain perpustakaan pytz. Seharusnya lebih dapat diandalkan untuk menentukan zona waktu menggunakan offset, misalnya
ssl.cert_time_to_second()
ASN1_TIME_print()
Jawaban:
Anda dapat membuat daftar semua zona waktu yang tersedia dengan
pytz.all_timezones
:Ada juga
pytz.common_timezones
:sumber
all_timezones
, pytz juga menyediakancommon_timezones
.'Asia/Shanghai'
.(datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()
(hasilnya bukan -28800). Saya akan menghindari pytz—dateutil.tz menyediakan fungsionalitas yang serupa tetapi menggunakan database zona waktu OS dan tidak memiliki masalah seperti itu.Jangan buat daftar Anda sendiri -
pytz
memiliki set bawaan:Anda kemudian dapat menerapkan zona waktu :
Atau jika Anda sudah memiliki
datetime
objek yang sadar TZ (tidak naif):sumber
Nama zona waktu adalah satu-satunya cara yang dapat diandalkan untuk menentukan zona waktu.
Anda dapat menemukan daftar nama zona waktu di sini: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Perhatikan bahwa daftar ini berisi banyak nama alias, seperti AS / Timur untuk zona waktu yang benar-benar disebut Amerika / New_York.
Jika Anda secara terprogram ingin membuat daftar ini dari basis data zoneinfo, Anda dapat mengompilasinya dari file zone.tab di basis data zoneinfo. Saya tidak berpikir pytz memiliki API untuk mendapatkannya, dan saya juga tidak berpikir itu akan sangat berguna.
sumber
Di sini, daftar kode negara Python, nama, benua, ibukota, dan zona waktu pytz.
Untuk daftar lengkap: Gist Github
Semoga bermanfaat.
sumber
Mereka tampaknya diisi oleh zona waktu basis data tz yang ditemukan di sini .
sumber
pytz
menyediakan akses ke basis data tz (ini adalah sumber untuk data wikipedia).EDIT: Saya akan sangat menghargainya jika Anda tidak mengundurkan diri jawaban ini lebih lanjut. Jawaban ini salah , tetapi saya lebih suka mempertahankannya sebagai catatan sejarah. Meskipun dapat diperdebatkan apakah antarmuka pytz rawan kesalahan, ia dapat melakukan hal-hal yang tidak dapat dilakukan dateutil.tz, terutama mengenai penghematan cahaya matahari di masa lalu atau di masa depan. Saya jujur mencatat pengalaman saya dalam sebuah artikel "Zona waktu dengan Python" .
Jika Anda menggunakan platform seperti Unix, saya sarankan Anda menghindari pytz dan lihat saja di / usr / share / zoneinfo. dateutil.tz dapat memanfaatkan informasi di sana.
Sepotong kode berikut menunjukkan masalah yang dapat diberikan pytz. Saya terkejut ketika saya pertama kali mengetahuinya. (Cukup menarik, pytz yang diinstal oleh yum pada CentOS 7 tidak menunjukkan masalah ini.)
Yaitu zona waktu yang dibuat oleh pytz adalah untuk waktu lokal yang sebenarnya, bukan standar waktu setempat yang diamati orang. Shanghai sesuai dengan +0800, bukan +0806 seperti yang disarankan oleh pytz:
EDIT: Terima kasih atas komentar dan downvote Mark Ransom, sekarang saya tahu saya menggunakan pytz dengan cara yang salah. Singkatnya, Anda tidak seharusnya meneruskan hasil dari
pytz.timezone(…)
kedatetime
, tetapi harus meneruskandatetime
kelocalize
metodenya.Terlepas dari argumennya (dan kesalahan saya karena tidak membaca dokumentasi pytz lebih hati-hati), saya akan menyimpan jawaban ini. Saya menjawab pertanyaan dengan satu cara (bagaimana menghitung zona waktu yang didukung, meskipun tidak dengan pytz), karena saya percaya pytz tidak memberikan solusi yang benar. Meskipun kepercayaan saya salah, jawaban ini masih memberikan beberapa informasi, IMHO, yang berpotensi bermanfaat bagi orang yang tertarik pada pertanyaan ini. Cara Pytz yang benar dalam melakukan sesuatu adalah kontra-intuitif. Heck, jika tzinfo yang dibuat oleh pytz tidak boleh langsung digunakan
datetime
, itu harus tipe yang berbeda. Antarmuka pytz dirancang dengan buruk. Tautan yang diberikan oleh Mark menunjukkan bahwa banyak orang, bukan hanya saya, telah disesatkan oleh antarmuka pytz.sumber
pytz
, Anda hanya salah menggunakannya. PS Ini bukan jawaban untuk pertanyaan sama sekali .datetime
antarmuka yang salah, bukanpytz
.datetime
tidak mengantisipasi objek zona waktu yang cerdas , sehingga antarmuka tidak menginisialisasi dengan benar.datetime
adalah bagian dari pustaka Python standar, dan itu adalah pytz yang harus mengikutidatetime
antarmuka, bukan sebaliknya. Jika ada yang bisa mengimplementasikan beberapa antarmuka dengan cara mereka berpikir lebih baik tanpa konsensus, tidak akan ada perangkat lunak yang kuat.pytz
tidak dapat mengikutidatetime
antarmuka karenadatetime
antarmuka kurang. Para penulis antarmuka itu tidak mengantisipasi masalah zona waktu yang parameternya berubah selama bertahun-tahun. Hanya karena itu bagian dari distribusi Python standar tidak berarti itu sempurna.Menurut pendapat saya ini adalah cacat desain perpustakaan pytz. Seharusnya lebih dapat diandalkan untuk menentukan zona waktu menggunakan offset, misalnya
yang memberi Anda zona waktu Kanada / Pasifik.
sumber