Hiểu biết về thời gian


90

Cung cấp mã python bên dưới, vui lòng giúp tôi hiểu điều gì đang xảy ra ở đó.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Vì vậy, tôi nhận được sự khác biệt giữa start timeend time, ở dòng 5, tôi làm tròn thời lượng bằng cách truyền và bây giờ thì sao, giải thích thêm là gì?

Tôi biết delta có nghĩa là gì (trung bình hoặc chênh lệch), nhưng tại sao tôi phải chuyển seconds = uptimeđến timedeltavà tại sao việc đúc chuỗi hoạt động tốt như vậy mà tôi nhận được HH:MM:SS?

Câu trả lời:


114

Bởi vì thời gian được định nghĩa như sau:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Tất cả các đối số là tùy chọn và mặc định là 0.

Theo cách đó, bạn có thể dễ dàng nói "Ba ngày và bốn mili giây" với các đối số tùy chọn.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

Và đối với truyền str, nó trả về một giá trị được định dạng đẹp thay vì __repr__để cải thiện khả năng đọc. Từ tài liệu:

str (t) Trả về một chuỗi có dạng [D day [s],] [H] H: MM: SS [.UUUUUU], trong đó D âm với t âm. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Tài liệu thanh toán:

http://docs.python.org/library/datetime.html#timedelta-objects


13

tại sao tôi phải vượt qua giây = thời gian hoạt động để hẹn giờ

Bởi vì các đối tượng thời gian có thể được truyền theo giây, mili giây, ngày, v.v ... nên bạn cần chỉ định những gì bạn đang chuyển vào (đây là lý do tại sao bạn sử dụng khóa rõ ràng). Đánh máy đối với intlà thừa vì họ cũng có thể chấp nhận phao nổi.

và tại sao quá trình đúc chuỗi hoạt động tốt đến mức tôi nhận được HH: MM: SS?

Nó không phải là cách đánh máy mà định dạng, là __str__phương thức bên trong của đối tượng. Trên thực tế, bạn sẽ đạt được kết quả tương tự nếu bạn viết:

print datetime.timedelta(seconds=int(uptime))

1
Bạn gợi ý về điều này, nhưng cần lưu ý rõ ràng rằng thời gian thực hiện nhiều thứ hơn là hiển thị mọi thứ ở định dạng HH: MM: SS. Đối tượng hẹn giờ được sử dụng bất cứ khi nào bạn cần có sự khác biệt giữa hai đối tượng datetime.
Wilduck

1
Nó không phải là __repr__phương pháp, nó là __str__phương pháp.
utdemir

1
Không phải __repr__()của thời gian, mà là __str__()phương pháp của nó . printcuộc gọi __str()__cho bạn.
bgporter
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.