2010-10-29 51 views
16

Câu hỏi: Viết một chương trình mà yêu cầu người dùng nhập vào một số giây, và hoạt động như sau:Python chức năng để chuyển đổi giây vào phút, giờ, và ngày

  • Có 60 giây trong một phút. Nếu số giây mà người dùng nhập vào lớn hơn hoặc bằng 60, chương trình sẽ hiển thị số phút trong nhiều giây đó.

  • Có 3600 giây trong một giờ. Nếu số giây do người dùng nhập lớn hơn hoặc bằng 3600, chương trình sẽ hiển thị số giờ trong nhiều giây.

  • Có 86400 giây trong một ngày. Nếu số giây do người dùng nhập lớn hơn hoặc bằng 86400, chương trình sẽ hiển thị số ngày trong nhiều giây đó.

Những gì tôi có cho đến nay:

def time(): 
    sec = int(input ('Enter the number of seconds:'.strip()) 
    if sec <= 60: 
     minutes = sec // 60 
     print('The number of minutes is {0:.2f}'.format(minutes)) 
    if sec (<= 3600): 
     hours = sec // 3600 
     print('The number of minutes is {0:.2f}'.format(hours)) 
    if sec <= 86400: 
     days = sec // 86400 
     print('The number of minutes is {0:.2f}'.format(days)) 
    return 
+0

Gợi ý: http://docs.python.org/library/functions.html#divmod cho phép bạn làm như sau: 'divmod (3660,3600) # (1, 60)' và 'divmod (60 , 60) # (1,0) '. Ngoài ra, bạn hỏi chính xác những gì? –

+0

Viết ra cách bạn làm trên giấy, sau đó biến nó thành mã. –

+0

Dựa trên mô tả của bạn, câu lệnh "if" của bạn phải là '> =', không phải '<='. –

Trả lời

1

Do nó là cách khác xung quanh trừ giây khi cần thiết, và không gọi nó là thời gian; có một gói với tên đó:

def sec_to_time(): 
    sec = int(input ('Enter the number of seconds:'.strip())) 

    days = sec/86400 
    sec -= 86400*days 

    hrs = sec/3600 
    sec -= 3600*hrs 

    mins = sec/60 
    sec -= 60*mins 
    print days, ':', hrs, ':', min, ':', sec 
+2

Không hoàn toàn đáp ứng các yêu cầu. –

29

này sẽ chuyển đổi n giây vào d ngày, h giờ, m phút, và s giây.

from datetime import datetime, timedelta 

def GetTime(): 
    sec = timedelta(seconds=int(input('Enter the number of seconds: '))) 
    d = datetime(1,1,1) + sec 

    print("DAYS:HOURS:MIN:SEC") 
    print("%d:%d:%d:%d" % (d.day-1, d.hour, d.minute, d.second)) 
+1

Tôi tin rằng có tối đa trên giây. Vì vậy, đây không phải là cách được đề xuất. Xem tài liệu: giây \t Giữa 0 và 86399 bao gồm http://docs.python.org/library/datetime.html –

+2

Có 86400 giây trong một ngày, vì vậy đó là lý do tại sao bạn chỉ có thể có 0-86399 giây. Nói cách khác, timedelta (giây = 86400) sẽ giải quyết thành ngày = 1, giây = 0. Do đó, 86399 không phải là giá trị đầu vào tối đa trong vài giây. –

+0

Dường như tôi hiểu lầm tài liệu, nếu đó là cách bạn nói. Vì vậy, những gì bạn có nghĩa là, nếu tôi sử dụng timedelta sau đây: timedelta (giây = 86450) nó sẽ tự động giải quyết để timedelta (ngày = 1, giây = 50)? Đúng không? Cám ơn bạn đã góp ý. –

1

Thoạt nhìn, tôi thấy divmod sẽ nhanh hơn vì đây là một câu lệnh đơn và chức năng tích hợp, nhưng timeit có vẻ hiển thị khác. Hãy xem xét ví dụ nhỏ này tôi đã nghĩ ra khi tôi cố gắng tìm ra phương pháp nhanh nhất để sử dụng trong vòng lặp liên tục chạy trong một idle_add gobject tách một giây truy cập vào một thời gian có thể đọc được của con người để cập nhật nhãn thanh tiến trình.

import timeit 

def test1(x,y, dropy): 
    while x > 0: 
     y -= dropy 
     x -= 1 

     # the test 
     minutes = (y-x)/60 
     seconds = (y-x) % 60.0 

def test2(x,y, dropy): 
    while x > 0: 
     y -= dropy 
     x -= 1 

     # the test 
     minutes, seconds = divmod((y-x), 60) 

x = 55  # litte number, also number of tests 
y = 10000 # make y > x by factor of drop 
dropy = 7 # y is reduced this much each iteration, for variation 

print "division and modulus:", timeit.timeit(lambda: test1(x,y,dropy)) 
print "divmod function:",  timeit.timeit(lambda: test2(x,y,dropy)) 

Chức năng divmod tích hợp có vẻ cực kỳ chậm so với sử dụng phân chia và mô đun đơn giản.

division and modulus: 12.5737669468 
divmod function: 17.2861430645 
21

Tidbit này rất hữu ích để hiển thị thời gian đã trôi qua với mức độ chi tiết khác nhau.

Cá nhân tôi nghĩ rằng các câu hỏi về hiệu quả thực tế là vô nghĩa ở đây, miễn là cái gì đó không hiệu quả một cách không hiệu quả. Tối ưu hóa sớm là gốc rễ của một chút ác. Điều này đủ nhanh đến nỗi nó sẽ không bao giờ là điểm nghẹt thở của bạn.

intervals = (
    ('weeks', 604800), # 60 * 60 * 24 * 7 
    ('days', 86400), # 60 * 60 * 24 
    ('hours', 3600), # 60 * 60 
    ('minutes', 60), 
    ('seconds', 1), 
    ) 

def display_time(seconds, granularity=2): 
    result = [] 

    for name, count in intervals: 
     value = seconds // count 
     if value: 
      seconds -= value * count 
      if value == 1: 
       name = name.rstrip('s') 
      result.append("{} {}".format(value, name)) 
    return ', '.join(result[:granularity]) 

..và này cung cấp sản lượng phong nha:

In [52]: display_time(1934815) 
Out[52]: '3 weeks, 1 day' 

In [53]: display_time(1934815, 4) 
Out[53]: '3 weeks, 1 day, 9 hours, 26 minutes' 
+1

Trên hệ thống Python 2.6.6 của tôi, tôi đã phải sử dụng 'result.append ("% s% s "% (giá trị, tên))' –

1

Các chức năng này là khá nhỏ gọn và chỉ sử dụng tiêu chuẩn Python 2.6 và sau này.

def ddhhmmss(seconds): 
    """Convert seconds to a time string "[[[DD:]HH:]MM:]SS". 
    """ 
    dhms = '' 
    for scale in 86400, 3600, 60: 
     result, seconds = divmod(seconds, scale) 
     if dhms != '' or result > 0: 
      dhms += '{0:02d}:'.format(result) 
    dhms += '{0:02d}'.format(seconds) 
    return dhms 


def seconds(dhms): 
    """Convert a time string "[[[DD:]HH:]MM:]SS" to seconds. 
    """ 
    components = [int(i) for i in dhms.split(':')] 
    pad = 4 - len(components) 
    if pad < 0: 
     raise ValueError('Too many components to match [[[DD:]HH:]MM:]SS') 
    components = [0] * pad + components 
    return sum(i * j for i, j in zip((86400, 3600, 60, 1), components)) 

Và đây là các thử nghiệm để đi với chúng. Tôi đang sử dụng gói pytest như một cách đơn giản để kiểm tra các ngoại lệ.

import ddhhmmss 

import pytest 


def test_ddhhmmss(): 
    assert ddhhmmss.ddhhmmss(0) == '00' 
    assert ddhhmmss.ddhhmmss(2) == '02' 
    assert ddhhmmss.ddhhmmss(12 * 60) == '12:00' 
    assert ddhhmmss.ddhhmmss(3600) == '01:00:00' 
    assert ddhhmmss.ddhhmmss(10 * 86400) == '10:00:00:00' 
    assert ddhhmmss.ddhhmmss(86400 + 5 * 3600 + 30 * 60 + 1) == '01:05:30:01' 
    assert ddhhmmss.ddhhmmss(365 * 86400) == '365:00:00:00' 


def test_seconds(): 
    assert ddhhmmss.seconds('00') == 0 
    assert ddhhmmss.seconds('02') == 2 
    assert ddhhmmss.seconds('12:00') == 12 * 60 
    assert ddhhmmss.seconds('01:00:00') == 3600 
    assert ddhhmmss.seconds('1:0:0') == 3600 
    assert ddhhmmss.seconds('3600') == 3600 
    assert ddhhmmss.seconds('60:0') == 3600 
    assert ddhhmmss.seconds('10:00:00:00') == 10 * 86400 
    assert ddhhmmss.seconds('1:05:30:01') == 86400 + 5 * 3600 + 30 * 60 + 1 
    assert ddhhmmss.seconds('365:00:00:00') == 365 * 86400 


def test_seconds_raises(): 
    with pytest.raises(ValueError): 
     ddhhmmss.seconds('') 
    with pytest.raises(ValueError): 
     ddhhmmss.seconds('foo') 
    with pytest.raises(ValueError): 
     ddhhmmss.seconds('1:00:00:00:00') 
0
seconds_in_day = 86400 
seconds_in_hour = 3600 
seconds_in_minute = 60 

seconds = int(input("Enter a number of seconds: ")) 

days = seconds // seconds_in_day 
seconds = seconds - (days * seconds_in_day) 

hours = seconds // seconds_in_hour 
seconds = seconds - (hours * seconds_in_hour) 

minutes = seconds // seconds_in_minute 
seconds = seconds - (minutes * seconds_in_minute) 

print("{0:.0f} days, {1:.0f} hours, {2:.0f} minutes, {3:.0f} seconds.".format(
    days, hours, minutes, seconds)) 
+4

Nó không phải là chỉ để viết mã như một câu trả lời. Bạn cũng nên bao gồm một số giải thích, ngay cả khi bạn nghĩ rằng nó có thể là hiển nhiên. –

0
#1 min = 60 
#1 hour = 60 * 60 = 3600 
#1 day = 60 * 60 * 24 = 86400 

    x=input('enter a positive integer: ') 

    t=int(x) 

    day= t//86400 
    hour= (t-(day*86400))//3600 
    minit= (t - ((day*86400) + (hour*3600)))//60 
    seconds= t - ((day*86400) + (hour*3600) + (minit*60)) 
    print(day, 'days' , hour,' hours', minit, 'minutes',seconds,' seconds') 
0

Để chuyển đổi giây (như string) vào datetime, điều này cũng có thể giúp đỡ. Bạn nhận được số ngày và giây. Giây có thể được chuyển đổi thành phút và giờ.

from datetime import datetime, timedelta 
sec = timedelta(seconds=(input('Enter the number of seconds: '))) 
time = str(sec) 
0

Tôi không hoàn toàn chắc chắn nếu bạn muốn, nhưng tôi đã có một nhiệm vụ tương tự và cần phải xóa trường nếu nó bằng 0. Ví dụ: 86401 giây sẽ hiển thị "1 ngày, 1 giây" thay vì "1 ngày, 0 giờ, 0 phút, 1 giây". Mã sau đây thực hiện điều đó.

def secondsToText(secs): 
    days = secs//86400 
    hours = (secs - days*86400)//3600 
    minutes = (secs - days*86400 - hours*3600)//60 
    seconds = secs - days*86400 - hours*3600 - minutes*60 
    result = ("{} days, ".format(days) if days else "") + \ 
    ("{} hours, ".format(hours) if hours else "") + \ 
    ("{} minutes, ".format(minutes) if minutes else "") + \ 
    ("{} seconds, ".format(seconds) if seconds else "") 
    return result 

CHỈNH SỬA: phiên bản tốt hơn xử lý số nhiều từ.

def secondsToText(secs): 
    days = secs//86400 
    hours = (secs - days*86400)//3600 
    minutes = (secs - days*86400 - hours*3600)//60 
    seconds = secs - days*86400 - hours*3600 - minutes*60 
    result = ("{0} day{1}, ".format(days, "s" if days!=1 else "") if days else "") + \ 
    ("{0} hour{1}, ".format(hours, "s" if hours!=1 else "") if hours else "") + \ 
    ("{0} minute{1}, ".format(minutes, "s" if minutes!=1 else "") if minutes else "") + \ 
    ("{0} second{1}, ".format(seconds, "s" if seconds!=1 else "") if seconds else "") 
    return result 

EDIT2: (. Xin lỗi, không đủ đại diện cho bình luận) đã tạo ra một gist nào đó trong một số ngôn ngữ

0

Patching Mr.B's answer, chúng tôi có thể trở lại granularity biến dựa trên số lượng thời gian. Ví dụ, chúng ta không nói "1 tuần, 5 giây", chúng tôi chỉ nói "1 tuần":

def display_time(seconds, granularity=2): 
    result = [] 

    for name, count in intervals: 
     value = seconds // count 
     if value: 
      seconds -= value * count 
      if value == 1: 
       name = name.rstrip('s') 
      result.append("{} {}".format(value, name)) 
     else: 
      # Add a blank if we're in the middle of other values 
      if len(result) > 0: 
       result.append(None) 
    return ', '.join([x for x in result[:granularity] if x is not None]) 

Một số mẫu đầu vào:

for diff in [5, 67, 3600, 3605, 3667, 24*60*60, 24*60*60+5, 24*60*60+57, 24*60*60+3600, 24*60*60+3667, 2*24*60*60, 2*24*60*60+5*60*60, 7*24*60*60, 7*24*60*60 + 24*60*60]: 
    print "For %d seconds: %s" % (diff, display_time(diff, 2)) 

... trả về kết quả này:

For 5 seconds: 5 seconds 
For 67 seconds: 1 minute, 7 seconds 
For 3600 seconds: 1 hour 
For 3605 seconds: 1 hour 
For 3667 seconds: 1 hour, 1 minute 
For 86400 seconds: 1 day 
For 86405 seconds: 1 day 
For 86457 seconds: 1 day 
For 90000 seconds: 1 day, 1 hour 
For 90067 seconds: 1 day, 1 hour 
For 172800 seconds: 2 days 
For 190800 seconds: 2 days, 5 hours 
For 604800 seconds: 1 week 
For 691200 seconds: 1 week, 1 day 
Các vấn đề liên quan