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.
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.
Jawaban:
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 kembali None
pada .dst()
bahkan jika struct.tm_isdst
ini 1
.
mktime()
harus tm_isdst
mempertimbangkan dan Python time.mktime()
memanggil mktime()
fungsi C pada CPython. mktime()
dapat memilih waktu setempat salah ketika itu adalah ambigu (misalnya, selama akhir-of-DST ( "jatuh kembali") transisi) jika struct.tm_isdst
ini -1
atau jika mktime()
pada platform yang diberikan mengabaikan masukan tm_isdst
. Juga, jika zona waktu lokal memiliki offset utc yang berbeda di masa lalu dan C mktime()
tidak menggunakan basis data tz historis yang dapat memberikan nilai offset utc yang lama, maka mktime()
dapat mengembalikan nilai yang salah (misalnya, satu jam) juga.
mktime()
tidak mengabaikan tm_isdst
platform yang diberikan (itu terjadi pada saya) maka fromtimestamp()
pasti kehilangan info: objek naif yang dikembalikan datetime
mewakili waktu lokal mungkin ambigu (timestamp -> waktu lokal adalah deterministik (jika kita mengabaikan detik kabisat) tetapi local 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 historis
Seperti ini:
>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
*
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 lanjut
t=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:
time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)
Sekarang perhatikan apa yang sebenarnya Anda dapatkan dengan bidang "diterbitkan".
Mon, 09 Sep 2013 19:57:42 -0400
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:
from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()
yang memberi kita:
published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00
Seseorang kemudian dapat menggunakan objek waktu-sadar datzone untuk menormalkan semua waktu ke UTC atau apa pun yang Anda anggap mengagumkan.
*_parsed
bidang dari feedparsed sudah dinormalisasi ke UTC karena dapat diperiksa dalam dokumentasi parsing tanggal sehingga ini mubazir.
datetime
objek yang hilang ketika feedparser
mem-parsing tanggal string mentah.