2009-04-21 40 views
298

Tôi có chức năng trả về thông tin trong vài giây, nhưng tôi cần lưu trữ thông tin đó theo giờ: phút: giây.Làm thế nào để chuyển đổi giây thành giờ, phút và giây?

Có cách nào dễ dàng để chuyển đổi các giây sang định dạng này trong python không?

+11

Nghịch đảo của vấn đề này có thể tìm thấy tại [Cách chuyển đổi chuỗi thời gian H: MM: SS thành giây trong Python?] (Http://stackoverflow.com/questions/6402812/how-to-convert-an -hmmss-time-string-to-seconds-in-python) – hughes

Trả lời

467

hoặc bạn có thể làm

>>> import datetime 
>>> str(datetime.timedelta(seconds=666)) 
'0:11:06' 
+5

Đây là cách tốt nhất, IMHO, khi bạn có thể sử dụng số học trên timedelta và bất kỳ đối tượng datetime nào. –

+8

divmod() thắng. xem bên dưới. – fiorix

+7

Điều này sẽ không thành công với giá trị hơn một ngày. –

481

Bằng việc sử dụng divmod() chức năng, mà không chỉ một bộ phận duy nhất để sản xuất cả hai thương và thời gian còn lại, bạn có thể có kết quả rất nhanh chóng chỉ với hai phép toán:

m, s = divmod(seconds, 60) 
h, m = divmod(m, 60) 
print "%d:%02d:%02d" % (h, m, s) 
+36

+1 cho divmod. Đó là _made_ cho các tình huống như thế này. –

+0

Tôi tuyên bố thứ hai của Paolo - đã không nghe nói về divmod trước đây. Tôi sẽ phải nhớ nó. – Smashery

+6

Tôi đã chỉnh sửa câu trả lời của bạn để bao gồm một liên kết đến tài liệu, vì nó được khuyến khích làm bất cứ khi nào có thể. –

45

tôi khó có thể đặt tên cho rằng một cách dễ dàng (ít nhất là tôi không thể nhớ cú pháp), nhưng nó có thể sử dụng time.strftime, mang đến cho kiểm soát nhiều hơn định dạng:

>>> import time 
>>> time.strftime("%H:%M:%S", time.gmtime(666)) 
'00:11:06' 

gmtime được sử dụng để chuyển đổi giây thành định dạng tuple đặc biệt mà yêu cầu strftime().

+0

Vâng, câu trả lời là thực sự được cung cấp ở đây - http://stackoverflow.com/questions/1384406/python-convert-seconds-to-hhmmss?lq=1 –

+6

Thật không may phương pháp này bắt đầu đo ngày từ 1 vì vậy nó không được thiết kế đại diện cho đồng bằng thời gian, và vì vậy nó là một tai nạn đang chờ xảy ra. Ví dụ với 'time.strftime ('% d% H:% M:% S', time.gmtime (1))' => '1 ngày, 0:00:01'. –

25
>>> "{:0>8}".format(datetime.timedelta(seconds=66)) 
>>> '00:01:06' # good 

và:

>>> "{:0>8}".format(datetime.timedelta(seconds=666777)) 
>>> '7 days, 17:12:57' # nice 

không có ': 0> 8':

>>> "{}".format(datetime.timedelta(seconds=66)) 
>>> '0:01:06' # not HH:MM:SS 

và:

>>> time.strftime("%H:%M:%S", time.gmtime(666777)) 
>>> '17:12:57' # wrong 

nhưng:

>>> "{:0>8}".format(datetime.timedelta(seconds=620000)) 
>>> '7 days, 4:13:20' # bummer 
+1

không thành công nếu đồng bằng nhỏ hơn một giây: định dạng '" {: 0> 8} "(timedelta (mili giây = 66)) '0: 00: 00.066000'' – jfs

+1

Đối với những người khác:' không có ': 0> 8 ': 'ví dụ thiếu một số 0 hàng đầu' ': 0> 8}' số không cho 8 số 0 trái. – TankorSmash

+2

Trong python 3.5.2, tôi nhận được một TypeError. Tôi định dạng biến 'time.time() - start'. Có cái nhìn sâu sắc nào không? 'TypeError: chuỗi định dạng không trống được truyền cho đối tượng .__ format__' – medley56

2

Đây là cách tôi nhận được.

def sec2time(sec, n_msec=3): 
    ''' Convert seconds to 'D days, HH:MM:SS.FFF' ''' 
    if hasattr(sec,'__len__'): 
     return [sec2time(s) for s in sec] 
    m, s = divmod(sec, 60) 
    h, m = divmod(m, 60) 
    d, h = divmod(h, 24) 
    if n_msec > 0: 
     pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec) 
    else: 
     pattern = r'%02d:%02d:%02d' 
    if d == 0: 
     return pattern % (h, m, s) 
    return ('%d days, ' + pattern) % (d, h, m, s) 

Một số ví dụ:

$ sec2time(10, 3) 
Out: '00:00:10.000' 

$ sec2time(1234567.8910, 0) 
Out: '14 days, 06:56:07' 

$ sec2time(1234567.8910, 4) 
Out: '14 days, 06:56:07.8910' 

$ sec2time([12, 345678.9], 3) 
Out: ['00:00:12.000', '4 days, 00:01:18.900'] 
+1

Lợi thế của việc này qua câu trả lời ở trên là gì? 'str (datetime.timedelta (seconds = 666))' –

+0

@RiazRizvi cho độ dài chuỗi nhất quán cho micro giây đối với các giá trị '666.0' và' 666.1'. –

6

Nếu bạn cần phải nhận được datetime.time giá trị, bạn có thể sử dụng thủ thuật này:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time() 

Bạn không thể thêm timedelta-time, nhưng có thể thêm nó vào datetime.

UPD: Tuy nhiên, một biến thể của cùng một kỹ thuật:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time() 

Thay vì 1 bạn có thể sử dụng bất kỳ số lớn hơn 0. Ở đây chúng ta sử dụng thực tế là datetime.fromordinal sẽ luôn luôn trả datetime đối tượng với time thành phần bằng không.

Các vấn đề liên quan