Chuyển đổi thời gian thành ngày, giờ và phút


242

Tôi đã có một timedelta. Tôi muốn những ngày, giờ và phút từ đó - dù là một tuple hay một cuốn từ điển ... Tôi không bị làm phiền.

Tôi đã phải thực hiện điều này hàng chục lần trong hàng tá ngôn ngữ trong nhiều năm qua nhưng Python thường có một câu trả lời đơn giản cho mọi thứ vì vậy tôi nghĩ rằng tôi đã hỏi ở đây trước khi tìm ra một số toán học đơn giản (nhưng dài dòng).

Ông Fooz nêu lên một điểm tốt.

Tôi đang xử lý "danh sách" (hơi giống danh sách ebay) trong đó mỗi danh sách có thời lượng. Tôi đang cố gắng tìm thời gian còn lại bằng cách làmwhen_added + duration - now

Tôi có đúng không khi nói rằng sẽ không tính đến DST? Nếu không, cách đơn giản nhất để thêm / bớt một giờ là gì?


Nếu chỉ lấy chuỗi dưới dạng HH: mm: ss, hãy nói "0:19:37" từ timedeltađối tượng "datetime.timedelta (giây = 1177)" : chỉ cần sử dụng str ()
Peter Mortensen

Câu trả lời:


342

Nếu bạn có một datetime.timedeltagiá trị td, td.daysđã cung cấp cho bạn "ngày" bạn muốn. timedeltacác giá trị giữ phân số trong ngày dưới dạng giây (không phải là giờ hoặc phút trực tiếp), do đó, bạn thực sự sẽ phải thực hiện "toán học đơn giản khó chịu", ví dụ:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

1
Hãy nhớ rằng nếu tdlà tiêu cực, -1 // 3600-1.
jcrs

4
tại sao // ? thay vì /
Mohammed Shareef C

10
//được sử dụng thay vì /để có được một số nguyên, không phải là số float.//là một toán tử phân chia tầng: "phép chia kết quả thành toàn bộ số được điều chỉnh sang trái trong dòng số", xem tại đây .
Eerik Sven Puudist

1
@EerikSvenPuudist như jcrsra nhọn, -1//3600được -1, vậy tại sao không sử dụng int(td.seconds/3600)thay vì để biến -1thứ hai vào 0giờ chứ không phải 1ngược giờ?
đơn giản

làm thế nào về việc thêm các giây còn lại là tốt? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60và sau đó seconds = x.seconds - hours*3600 - minutes*60
raphael

73

Điều này nhỏ gọn hơn một chút, bạn có được giờ, phút và giây trong hai dòng.

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

7
nó không chính xác nếu td.dayskhác không. Bạn cần hours += td.days*24. Nếu bạn muốn tính đến phân số của giây (OP không); seconds += td.microseconds / 1e6có thể được sử dụng.
JFS

30
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Đối với DST, tôi nghĩ điều tốt nhất là chuyển đổi cả hai datetimeđối tượng thành giây. Bằng cách này, hệ thống sẽ tính toán DST cho bạn.

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1
mktime()có thể thất bại nếu múi giờ địa phương có thể có độ lệch utc khác nhau vào các thời điểm khác nhau (nhiều người làm) - bạn có thể sử dụng pytzmô-đun để truy cập vào cơ sở dữ liệu tz theo cách phổ biến di động. Ngoài ra, giờ địa phương có thể không rõ ràng (50% khả năng xảy ra lỗi) - bạn cần một số thông tin bổ sung để định hướng, ví dụ, thường (không phải luôn luôn) ngày trong tệp nhật ký là đơn điệu . Xem Làm thế nào tôi có thể trừ một ngày từ một ngày trăn? điều đó có thể phải đối phó với các vấn đề tương tự.
jfs

7

Tôi không hiểu

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Còn cái này thì sao

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

Bạn nhận được vài phút và giây của một phút như một chiếc phao.


0

Tôi đã sử dụng như sau:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

-2

timedeltas có một dayssecondsthuộc tính .. bạn có thể tự chuyển đổi chúng một cách dễ dàng.

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.