Làm cách nào để kiểm tra sự khác biệt, tính bằng giây, giữa hai ngày?


180

Phải có một cách dễ dàng hơn để làm điều này. Tôi có các đối tượng muốn được làm mới thường xuyên, vì vậy tôi muốn ghi lại khi chúng được tạo, kiểm tra dấu thời gian hiện tại và làm mới khi cần thiết.

datetime.datetime đã được chứng minh là khó khăn và tôi không muốn đi sâu vào thư viện ctime. Có điều gì dễ dàng hơn cho loại điều này?

Câu trả lời:


516

nếu bạn muốn tính toán sự khác biệt giữa hai ngày đã biết, hãy sử dụng total_secondsnhư sau:

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()

86400.0

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

0


95
'Ghi chú' là phần quan trọng nhất mà mọi người bỏ lỡ. Tôi ước tôi có thể bỏ phiếu khác cho nó.
Dexter

Có những lúc tôi nhận thấy nó cho kết quả dường như ... không chính xác. 59.800 giây cho một sự khác biệt thứ hai chia. Vì vậy, đối với các hoạt động nhỏ hơn, chẳng hạn như chênh lệch giây, mili giây hoặc micro giây, người ta có thể sử dụng (b-a).microsecondsvà sau đó chia số đó để lấy giây (1000000) hoặc mili giây (1000)
Zld Productions

có vẻ như giá trị luôn dương, ngay cả khi a và b được hoán đổi
Nickpick

@Nickpick giá trị không phải lúc nào cũng tích cực. ví dụ như sau -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Giải pháp ấn tượng! Làm sạch mã không cần thiết để tạo chức năng.
Paulo zOiO zuLLu Fabrício

36
import time  
current = time.time()

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

bạn có muốn công việc kia?


1
+1; chúng tôi không thực sự quan tâm đến ngày của một trong hai lần gọi - chúng tôi quan tâm đến thời gian đã trôi qua. Vì vậy, chỉ cần sử dụng một dấu thời gian thô, như được hiển thị.
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 sẽ là bất cứ khoảng thời gian nào bạn chờ đợi một chút ở trên)

Tôi thấy datetime.datetime khá hữu ích, vì vậy nếu có một kịch bản phức tạp hoặc khó xử mà bạn gặp phải, vui lòng cho chúng tôi biết.

EDIT: Cảm ơn @WoLpH vì đã chỉ ra rằng người ta không nhất thiết phải tìm cách làm mới thường xuyên đến mức các mốc thời gian sẽ gần nhau. Bằng cách tính toán cho những ngày ở đồng bằng, bạn có thể xử lý các chênh lệch dấu thời gian dài hơn:

>>> 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 * 86400Thay vào đó, nếu bạn quay lại , điều đó đúng trong nhiều ngày;)
Wolph

7
Lưu ý rằng, trong trường hợp chung, điều này là không chính xác . Hãy xem xét các trường hợp a - b, nơi atrước b (ví dụ, vì vậy kết quả sẽ là tiêu cực): (a - b).seconds == 86282khi a - b == datetime.timedelta(-1, 86276, 627665). Tôi tin rằng phương pháp đúng là sử dụng timedelta.total_seconds()nhưng Nhưng đó chỉ là py2.7 +.
David Wolever

4
Thật vậy, câu trả lời là không đúng và nên phản ánh bình luận của @DavidWolever. Câu trả lời đúng là: sử dụng timedelta.total_seconds(). Downvote cho phù hợp.
astrojuanlu

3
Nâng cấp cho câu trả lời Python 2.6. total_seconds()là một tính năng 2.7+.
Joe Holloway

@JoeHolloway Tôi đoán rằng điều này cũng không hoạt động chính xác trong Python 2.6.
zen11625

12

Chúng tôi có hàm Total_seconds () với Python 2.7 Vui lòng xem mã bên dưới cho 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

Đây là một trong đó đang làm việc cho tôi.

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;

Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.