Member 12776322 Ответов: 1

Как преобразовать секунды в удобные для человека длительности?


Мой скрипт на Python почти готов, так что вот он:

def prettyList(human_time):
    if len(human_time) > 1:
        return ' '.join([', '.join(human_time[:-1]), "and", human_time[-1]])
    elif len(human_time) == 1:
        return human_time[0]
    else:
        return ""

def format_duration(seconds, granularity = 5):
    intervals = (('years', 29030400), ('months', 2419200), ('weeks', 604800),('days', 86400),('hours', 3600), ('minutes', 60), ('seconds', 1))
    human_time = []
    for name, count in intervals: 
        value = seconds // count
        if value: 
            seconds -= value * count
            if value == 1:
                name = name.rstrip('s')
            human_time.append("{} {}".format(value, name))
    if not human_time:
        return "now"
    human_time = human_time[:granularity]
    return prettyList(human_time)


Код должен принимать ввод секунд, который затем считывает с правильной грамматикой список длительностей (годы, месяцы, недели, дни, часы, минуты, секунды). Мои тесты проходят, но для одного из более крупных тестов он читает следующее:

'6 months, 2 weeks, 1 hour, 44 minutes and 40 seconds' should equal '182 days, 1 hour, 44 minutes and 40 seconds'


По сути, это требует, чтобы я перевел то, что сейчас составляет 6 месяцев и 2 недели, в 182 дня. Пожалуйста, посоветуйте!

Что я уже пробовал:

Я попытался перевести секунды как длительности, а затем соединить их в соответствии с правильными запятыми и "и", чтобы сделать выходное утверждение грамматически правильным. Моя грамматика на месте, это длительность, которая доставляет мне сейчас неприятности!

Richard MacCutchan

Ваше месячное значение составляет 28 дней, что относится только к февралю в 3 из каждых 4 лет. Месяцы, скорее всего, будут длиться 30 или 31 день.

Значение, которое вы вычисляете в днях и т. д., равно 6,5 месяцам По вашим (неправильным) значениям.

1 Ответов

Рейтинг:
2

Patrice T

Вы уверены, что это ваш код и что вы не можете заставить его ответить через несколько дней ?
изменение действительно легко, вы должны быть в состоянии сделать это сами.

Отчет об ошибке:
Вы должны проверить количество секунд в годах и в месяцах, есть сюрприз :)

Цитата:
"6 месяцев, 2 недели, 1 час, 44 минуты и 40 секунд "должно равняться" 182 дням, 1 часу, 44 минутам и 40 секундам".
Если вы немного пошевелите мозгами, то обнаружите, что 182 дня-это примерно полгода или 6 месяцев, а не 6 месяцев и 2 недели!

[Обновление]
Цитата:
Функция должна принимать неотрицательное целое число. Если он равен нулю, он просто возвращает "сейчас". В противном случае продолжительность выражается как комбинация лет, дней, часов, минут и секунд.

Итак, где вы видели, что вам нужны месяцы и недели ?


Member 12776322

Я изменил свою продолжительность, и теперь результат теста "26 недель, 1 час, 44 минуты и 40 секунд" должен быть равен "182 дням, 1 часу, 44 минутам и 40 секундам".

деф prettyList(human_time):
если len (human_time) > 1:
возвращение ' '.присоединить([', '.присоединиться(human_time[:-1]), "и", human_time[-1]])
Элиф лен (human_time) == 1:
вернуться human_time[0]
ещё:
вернуть ""

def format_duration(секунды, детализация = 4):
интервалы = (("годы", 31104000), ("месяцы", 31449600), ("недели", 604800), ("дни", 86400), ("часы", 3600), ("минуты", 60), ("секунды", 1))
человеческое время = []
имя, Граф в промежутках:
значение = секунды / / количество
если значение:
секунды - = значение * количество
если значение == 1:
name = name.rstrip('s')
human_time.добавить("{} {}".формат(значение, имя))
если не human_time:
возвращение " сейчас"
human_time = human_time [: детализация]
вернуться prettyList(human_time)

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Вопрос: откуда вы знаете, что должны ответить через несколько дней?

Member 12776322

Ну, вот тут-то я и запутался, потому что в инструкции говорится следующее:

Функция должна принимать неотрицательное целое число. Если он равен нулю, он просто возвращает "сейчас". В противном случае продолжительность выражается как комбинация лет, дней, часов, минут и секунд.