ฉันจะตรวจสอบความแตกต่างเป็นวินาทีระหว่างวันที่สองวันได้อย่างไร


181

จะต้องมีวิธีที่ง่ายกว่านี้ ฉันมีวัตถุที่ต้องการให้รีเฟรชทุก ๆ ครั้งดังนั้นฉันต้องการบันทึกเมื่อมีการสร้างตรวจสอบกับการประทับเวลาปัจจุบันและการรีเฟรชตามความจำเป็น

datetime.datetime พิสูจน์แล้วว่าเป็นเรื่องยากและฉันไม่ต้องการดำดิ่งลงในไลบรารี ctime มีอะไรง่าย ๆ สำหรับสิ่งนี้ไหม

คำตอบ:


517

หากคุณต้องการคำนวณความแตกต่างระหว่างวันที่สองวันที่ทราบให้ใช้total_secondsดังนี้:

import datetime as dt

a = dt.datetime(2013,12,30,23,59,59)
b = dt.datetime(2013,12,31,23,59,59)

(b-a).total_seconds()

86,400.0

#note that seconds doesn't give you what you want:
(b-a).seconds

0


95
`note 'เป็นส่วนที่สำคัญที่สุดที่คนคิดถึง ฉันหวังว่าฉันจะให้คะแนนอีกครั้งได้
เด็กซ์เตอร์

มีบางครั้งที่ฉันสังเกตเห็นว่ามันให้ผลลัพธ์ที่ไม่ถูกต้อง ... ดูเหมือนว่า 59.800 วินาทีสำหรับความแตกต่างเสี้ยววินาที ดังนั้นสำหรับการดำเนินงานที่มีขนาดเล็กเช่นความแตกต่างของวินาทีมิลลิวินาทีหรือไมโครวินาทีเราสามารถใช้ (b-a).microsecondsแล้วหารเพื่อให้ได้วินาที (1000000) หรือมิลลิวินาที (1000)
โปรดักชั่น Zld

ดูเหมือนว่าค่าจะเป็นค่าบวกเสมอแม้ว่าจะเปลี่ยน a และ b แล้ว
ก็ตาม

@Nickpick ค่าไม่ได้เป็นค่าบวกเสมอไป เช่นต่อไปนี้คือ-60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

ทางออกที่น่าประทับใจ! รหัสสะอาดไม่จำเป็นสำหรับการสร้างฟังก์ชั่น
เปาโล zOiO zuLLu Fabrício

37
import time  
current = time.time()

...job...
end = time.time()
diff = end - current

มันจะเหมาะกับคุณไหม


1
+1; เราไม่สนใจเกี่ยวกับวันที่ของการเรียกร้อง - เราสนใจเวลาที่ผ่านไป ดังนั้นให้ใช้การประทับเวลาแบบดิบดังที่แสดง
Karl Knechtel

14
>>> from datetime import datetime

>>>  a = datetime.now()

# wait a bit 
>>> b = datetime.now()

>>> d = b - a # yields a timedelta object
>>> d.seconds
7

(7 จะเป็นจำนวนเวลาที่คุณรออยู่ข้างบน)

ฉันพบว่า datetime.datetime มีประโยชน์พอสมควรดังนั้นหากมีสถานการณ์ที่ซับซ้อนหรือน่าอึดอัดใจที่คุณพบโปรดแจ้งให้เราทราบ

แก้ไข: ขอบคุณ @WoLpH ที่ชี้ให้เห็นว่าไม่จำเป็นต้องค้นหาเพื่อรีเฟรชบ่อยครั้งเพื่อให้ชุดข้อมูลจะปิดกัน ด้วยการบันทึกวันในเดลต้าคุณสามารถจัดการความคลาดเคลื่อนของการประทับเวลาที่นานขึ้น:

>>> a = datetime(2010, 12, 5)
>>> b = datetime(2010, 12, 7)
>>> d = b - a
>>> d.seconds
0
>>> d.days
2
>>> d.seconds + d.days * 86400
172800

1
หากคุณกลับมาd.seconds + d.days * 86400จะถูกต้องเป็นเวลาหลายวัน;)
Wolph

7
โปรดทราบว่าในกรณีทั่วไปนี้เป็นไม่ถูกต้อง พิจารณากรณีa - bที่aเป็นก่อน b (เช่นดังนั้นผลที่ได้จะเป็นค่าลบ): ในขณะที่(a - b).seconds == 86282 a - b == datetime.timedelta(-1, 86276, 627665)ฉันเชื่อว่าวิธีที่ถูกต้องคือใช้timedelta.total_seconds()… แต่นั่นคือ py2.7 + เท่านั้น
David Wolever

4
แน่นอนคำตอบนั้นไม่ถูกต้องและควรสะท้อนถึงความคิดเห็น @DavidWolever คำตอบที่ถูกต้องคือ: timedelta.total_seconds()การใช้งาน ลดลงตาม
astrojuanlu

3
โหวตขึ้นสำหรับ Python 2.6 คำตอบ total_seconds()เป็นคุณสมบัติ 2.7+
Joe Holloway

@ JoeHolloway ฉันเดาว่านี่จะทำงานไม่ถูกต้องใน Python 2.6 ด้วย
zen11625

12

เรามีฟังก์ชัน total_seconds () พร้อม Python 2.7 โปรดดูโค้ดด้านล่างสำหรับ python 2.6

import datetime
import time  

def diffdates(d1, d2):
    #Date format: %Y-%m-%d %H:%M:%S
    return (time.mktime(time.strptime(d2,"%Y-%m-%d %H:%M:%S")) -
               time.mktime(time.strptime(d1, "%Y-%m-%d %H:%M:%S")))

d1 = datetime.now()
d2 = datetime.now() + timedelta(days=1)
diff = diffdates(d1, d2)

0

นี่คือสิ่งที่ใช้ได้กับฉัน

from datetime import datetime

date_format = "%H:%M:%S"

# You could also pass datetime.time object in this part and convert it to string.
time_start = str('09:00:00') 
time_end = str('18:00:00')

# Then get the difference here.    
diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

# Get the time in hours i.e. 9.60, 8.5
result = diff.seconds / 3600;

หวังว่านี่จะช่วยได้!

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