Chuyển đổi timedelta thành tổng số giây


185

Tôi có một sự khác biệt thời gian

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

Bây giờ, làm thế nào để tôi tìm thấy tổng số giây đã trôi qua? diff.secondskhông tính ngày. Tôi có thể làm:

diff.seconds + diff.days * 24 * 3600

Có một phương pháp dựng sẵn cho việc này?


8
@RestRisiko - bạn nói đúng. Tuy nhiên, thật hữu ích khi có câu hỏi về Stack Overflow, vì vậy lần sau khi tôi hoặc người khác, Googles cho nó, anh ấy có một câu trả lời tốt là kết quả hàng đầu.
ripper234

Chúng ta có thể thảo luận về các định nghĩa thay thế của "tốt" sau này; xin vui lòng đọc câu trả lời của tôi trước khi bạn chạy đi :)
John Machin

Có nhiều vấn đề với máy tính time1difftrong mã của bạn. Để có được thời gian utc hiện tại như một đối tượng datetime ngây thơ, datetime.utcnow()thay vào đó hãy sử dụng . Để hiểu lý do tại sao bạn nên sử dụng UTC thay vì giờ địa phương để tìm sự khác biệt, hãy xem Tìm nếu 24 giờ đã trôi qua giữa thời gian - Python . time.monotonic()có thể thích hợp hơn để tìm thời gian trôi qua giữa các sự kiện (thay vì time.time()hoặc datetime.utcnow()).
jfs

Câu trả lời:



8

Bạn có một vấn đề theo cách này hay cách khác với datetime.datetime.fromtimestamp(time.mktime(time.gmtime())) biểu hiện .

(1) Nếu tất cả những gì bạn cần là sự khác biệt giữa hai nội dung trong vài giây, thì công việc rất đơn giản time.time().

(2) Nếu bạn đang sử dụng các dấu thời gian đó cho các mục đích khác, bạn cần xem xét những gì bạn đang làm, vì kết quả có mùi lớn trên tất cả:

gmtime()trả về một tuple thời gian trong UTC nhưng mktime()mong đợi một tuple thời gian trong giờ địa phương.

Tôi đang ở Melbourne, Úc, nơi TZ tiêu chuẩn là UTC + 10, nhưng tiết kiệm ánh sáng ban ngày vẫn còn hiệu lực cho đến sáng mai nên đó là UTC + 11. Khi tôi thực hiện như sau, đó là 2011-04-02T20: 31 giờ địa phương tại đây ... UTC là 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

Bạn sẽ nhận thấy rằng t3, kết quả của biểu thức của bạn là UTC + 1, dường như là UTC + (sự khác biệt DST cục bộ của tôi) ... không có ý nghĩa lắm. Bạn nên cân nhắc việc sử dụng datetime.datetime.utcnow()sẽ không tăng thêm một giờ khi DST bật / tắt và có thể cho bạn độ chính xác cao hơntime.time()


Cảm ơn bạn đã làm rõ. Đối với mục đích tôi đang sử dụng ngay bây giờ, sự khác biệt thậm chí vài giờ mỗi giờ và sau đó không quan trọng, nhưng tôi chắc chắn sẽ kiểm tra điều này trong tương lai khi tôi viết một cái gì đó có ý nghĩa hơn.
ripper234

-7

Bạn có thể sử dụng mô đun mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
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.