Уведомления

Группа в Telegram: присоединиться

#1 Июнь 10, 2019 13:13:01

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

вывод времени по-русски

Здравствуйте!

Есть ли какая-нибудь библиотека, которой можно подать на вход объект datetime или timedelta, а на выходе получать строки такого вида:
"1 день 2 часа 15 минут“, ”28 минут 17 секунд“, ”53 секунды" и т.д.

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



Офлайн

#2 Июнь 10, 2019 15:08:58

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

вывод времени по-русски

После некоторых размышлений понял, что при моих запросах никакая библиотека не поможет, и написал сам.
Выглядит страшновато, но сходу не знаю, как заменить эти бесконечные if'ы на что-то более изящное:

 def seconds_to_rus(seconds_in: float):
    GROUPS = {1:1, 2:2, 3:2, 4:2, 5:5, 6:5, 7:5, 8:5, 9:5, 0:5}
    HOURS = {1: "час", 2: "часа", 5: "часов"}
    MINUTES = {1: "минута", 2: "минуты", 5: "минут"}
    SECONDS = {1: "секунда", 2: "секунды", 5: "секунд"}
    if seconds_in < 0.1:
        return "0.1 секунды"
    if seconds_in < 1:
        return "%.1f секунды" % seconds_in
    if seconds_in < 1.1:
        return "1 секунда"
    if seconds_in < 2:
        return "%.1f секунды" % seconds_in
    if seconds_in < 2.1:
        return "2 секунды"
    if seconds_in < 3:
        return "%.1f секунды" % seconds_in
    seconds_in = int(round(seconds_in))
    seconds_1 = seconds_in % 10
    if seconds_in < 60: # 1 минута
        return "%d %s" % (seconds_in, SECONDS[GROUPS[seconds_1]])
    if seconds_in < 300: # 5 минут
        minutes_in = int(seconds_in / 60.0)
        minutes_1 = minutes_in % 10
        seconds_in %= 60
        if seconds_in:
            return "%d %s %d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]], seconds_in, SECONDS[GROUPS[seconds_1]])
        else:
            return "%d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]])
    minutes_in = int(round(seconds_in / 60.0))
    minutes_1 = minutes_in % 10
    if minutes_in < 60: # 1 час
        return "%d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]])
    else:
        hours_in = int(minutes_in / 60.0)
        hours_1 = hours_in % 10
        minutes_in %= 60
        if minutes_in:
            return "%d %s %d %s" % (hours_in, HOURS[GROUPS[hours_1]], minutes_in, MINUTES[GROUPS[minutes_1]])
        else:
            return "%d %s" % (hours_in, HOURS[GROUPS[hours_1]])



Отредактировано Striver (Июнь 10, 2019 15:28:29)

Офлайн

#3 Июнь 10, 2019 18:33:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6285
Репутация: +  562  -
Профиль   Отправить e-mail  

вывод времени по-русски

Пример на C.
Пример на питоне.
Пример на питоне (демо).



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version