แปลง timedelta เป็นวินาทีทั้งหมด


186

ฉันมีเวลาที่แตกต่าง

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

ทีนี้ฉันจะหาจำนวนวินาทีทั้งหมดที่ผ่านไปได้อย่างไร diff.secondsไม่นับวัน ฉันทำได้:

diff.seconds + diff.days * 24 * 3600

มีวิธี builtin สำหรับสิ่งนี้หรือไม่?


8
@RestRisiko - คุณพูดถูก ยังคงมีประโยชน์ที่จะมีคำถามเกี่ยวกับ Stack Overflow ดังนั้นในครั้งต่อไปที่ฉันหรือคนอื่น Googles สำหรับมันเขามีคำตอบที่ดีว่าเป็นผลลัพธ์อันดับต้น ๆ
ripper234

เราสามารถพูดถึงคำจำกัดความทางเลือกของ "ดี" ได้ในภายหลัง โปรดอ่านคำตอบของฉันก่อนที่คุณจะหนี :)
จอห์นมาชิน

มีปัญหาหลายอย่างเกี่ยวกับการคำนวณtime1และdiffในรหัสของคุณ ในการรับเวลา utc ปัจจุบันเป็นวัตถุ datetime ไร้เดียงสาให้ใช้datetime.utcnow()แทน จะเข้าใจว่าทำไมคุณควรใช้เวลา UTC แทนเวลาท้องถิ่นเพื่อหาเห็นความแตกต่างค้นหาตลอด 24 ชั่วโมงหากมีการส่งผ่านระหว่าง datetimes - งูหลาม time.monotonic()อาจจะดีกว่าที่จะหาเวลาที่ผ่านไประหว่างเหตุการณ์ (แทนtime.time()หรือdatetime.utcnow())
jfs

คำตอบ:


384

timedelta.total_seconds()ใช้

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0

26
ใหม่ใน python 2.7
Evgeny

7
หากใครบางคนยังต้องเข้ากันได้กับ 2.6: ดูstackoverflow.com/questions/3318348/วิธีการขยาย datetime.timedelta ด้วยวิธีการใหม่ด้วยตัวคุณเอง
Uwe Geuder

6
datetime.timedelta.total_seconds (time2-time1) ใน Python3.6
Russo

8

คุณมีปัญหาไม่ทางใดก็ทางหนึ่งกับdatetime.datetime.fromtimestamp(time.mktime(time.gmtime()))การแสดงออกของคุณ

(1) หากสิ่งที่คุณต้องการคือความแตกต่างระหว่างสอง instants ในไม่กี่วินาทีง่ายมากtime.time()ทำงาน

(2) หากคุณใช้การประทับเวลาเหล่านั้นเพื่อจุดประสงค์อื่นคุณต้องพิจารณาสิ่งที่คุณทำเพราะผลที่ได้จะมีกลิ่นเหม็นทั่ว:

gmtime()ส่งกลับค่าเวลา tuple ในUTCแต่mktime()คาดว่าจะส่งสัญญาณเวลาในเวลาท้องถิ่น

ฉันอยู่ในเมลเบิร์นออสเตรเลียซึ่งมาตรฐาน TZ คือ UTC + 10 แต่การปรับเวลาตามฤดูกาลยังคงมีผลใช้บังคับจนถึงพรุ่งนี้เช้าดังนั้นจึงเป็น UTC + 11 เมื่อฉันดำเนินการต่อไปนี้เป็น 2011-04-02T20: 31 เวลาท้องถิ่นที่นี่ ... UTC คือ 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

คุณจะสังเกตเห็นว่า t3 ผลลัพธ์ของนิพจน์ของคุณคือ UTC + 1 ซึ่งดูเหมือนว่า UTC + (ความแตกต่างของเวลาท้องถิ่นของฉัน) ... ไม่ค่อยมีความหมายมากนัก คุณควรพิจารณาการใช้datetime.datetime.utcnow()ซึ่งจะไม่เพิ่มขึ้นหนึ่งชั่วโมงเมื่อ DST เปิด / ปิดและอาจให้ความแม่นยำมากกว่าtime.time()


ขอขอบคุณสำหรับการชี้แจง. เพื่อจุดประสงค์ที่ฉันใช้อยู่ในตอนนี้ความแตกต่างของเวลาไม่กี่ชั่วโมงทุกครั้งและจากนั้นก็ไม่สำคัญ แต่ฉันจะต้องตรวจสอบเรื่องนี้ในอนาคตเมื่อฉันเขียนสิ่งที่มีความหมายมากขึ้น
ripper234

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.