Bagaimana Anda mengubah time.struct_time
objek Python menjadi datetime.datetime
objek?
Saya memiliki perpustakaan yang menyediakan perpustakaan pertama dan perpustakaan kedua yang menginginkan perpustakaan kedua.
Gunakan time.mktime () untuk mengubah tuple waktu (dalam localtime) menjadi detik sejak Zaman, kemudian gunakan datetime.fromtimestamp () untuk mendapatkan objek datetime.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
data? Saya kira begitu, yang dihasilkan objek datetime tetap naif untuk sejauh kembaliNone
pada.dst()
bahkan jikastruct.tm_isdst
ini1
.mktime()
harustm_isdst
mempertimbangkan dan Pythontime.mktime()
memanggilmktime()
fungsi C pada CPython.mktime()
dapat memilih waktu setempat salah ketika itu adalah ambigu (misalnya, selama akhir-of-DST ( "jatuh kembali") transisi) jikastruct.tm_isdst
ini-1
atau jikamktime()
pada platform yang diberikan mengabaikan masukantm_isdst
. Juga, jika zona waktu lokal memiliki offset utc yang berbeda di masa lalu dan Cmktime()
tidak menggunakan basis data tz historis yang dapat memberikan nilai offset utc yang lama, makamktime()
dapat mengembalikan nilai yang salah (misalnya, satu jam) juga.mktime()
tidak mengabaikantm_isdst
platform yang diberikan (itu terjadi pada saya) makafromtimestamp()
pasti kehilangan info: objek naif yang dikembalikandatetime
mewakili waktu lokal mungkin ambigu (timestamp -> waktu lokal adalah deterministik (jika kita mengabaikan detik kabisat) tetapilocal time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp () `dapat memilih offset utc yang salah jika tidak menggunakan basis data tz historisSeperti ini:
sumber
*
dan**
sintaks memungkinkan Anda untuk memperluas objek tipe listy atau dicty ke argumen yang terpisah - itu salah satu bagian favorit saya dari Python lovelyness. Lihat docs.python.org/2/tutorial/… untuk info lebih lanjutt=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
datetime
:datetime(*t[:5]+(min(t[5], 59),))
misalnya, untuk menerima"2015-06-30 16:59:60 PDT"
.Ini bukan jawaban langsung untuk pertanyaan Anda (yang sudah dijawab dengan cukup baik). Namun, setelah beberapa kali menggigit saya pada dasar beberapa kali, saya tidak bisa cukup menekankan bahwa itu akan mendorong Anda untuk melihat dengan cermat apa yang disediakan waktu Anda.
Dengan asumsi Anda memiliki objek time.struct_time, dan beberapa string tanggal / waktu lainnya, bandingkan keduanya, dan pastikan Anda tidak kehilangan data dan secara tidak sengaja membuat objek datetime yang naif, ketika Anda bisa melakukan sebaliknya.
Misalnya, modul feedparser yang sangat baik akan mengembalikan bidang "diterbitkan" dan dapat mengembalikan objek time.struct_time dalam bidang "publish_parsed" -nya:
Sekarang perhatikan apa yang sebenarnya Anda dapatkan dengan bidang "diterbitkan".
Oleh Stallman 's Beard! Informasi zona waktu!
Dalam hal ini, pria malas mungkin ingin menggunakan modul dateutil yang sangat baik untuk menjaga informasi zona waktu:
yang memberi kita:
Seseorang kemudian dapat menggunakan objek waktu-sadar datzone untuk menormalkan semua waktu ke UTC atau apa pun yang Anda anggap mengagumkan.
sumber
*_parsed
bidang dari feedparsed sudah dinormalisasi ke UTC karena dapat diperiksa dalam dokumentasi parsing tanggal sehingga ini mubazir.datetime
objek yang hilang ketikafeedparser
mem-parsing tanggal string mentah.