diff --git a/mo/util_format.py b/mo/util_format.py index 1b77ef32775a61312c348ced9f924c1a6bfabca8..663cb581e834de1ed161648dc7cebd5c3a44d6fc 100644 --- a/mo/util_format.py +++ b/mo/util_format.py @@ -46,33 +46,39 @@ def timedelta(d: datetime, ref: Optional[datetime] = None, descriptive: bool = F prefix = "za " before = False + # Zkonstruujeme nejvýše dvě části: pokud je v první číslo >= 10, další už + # nekonstruujeme, pokud je <10, tak přidáme ještě jednu část. Tvoříme tedy + # řetězce jako: "za 28 dní", "za 8 dní 16 hodin", "za 7 hodin 55 minut", + # "za 55 minut", "za 3 minuty 12 sekund", ... + parts = [] + prev = 0 if delta.days > 0: - unitprefix = '' if before: - value = inflect_number(delta.days, 'den' if descriptive else 'dnem', 'dny', 'dny') + parts.append(inflect_number(delta.days, 'den' if descriptive else 'dnem', 'dny', 'dny')) else: - value = inflect_number(delta.days, 'den', 'dny', 'dní') - else: - if delta.seconds > 3600: - unitprefix = 'hodin' - number = delta.seconds // 3600 - elif delta.seconds > 60: - unitprefix = 'minut' - number = delta.seconds // 60 - else: - unitprefix = 'sekund' - number = delta.seconds + parts.append(inflect_number(delta.days, 'den', 'dny', 'dní')) + prev = delta.days + seconds = delta.seconds + for (unitprefix, s) in [('hodin', 3600), ('minut', 60), ('sekund', 1)]: + number = seconds // s + seconds = seconds % s + if len(parts) == 2 or (len(parts) == 1 and number == 0) or prev >= 10: + break + if number == 0: + continue + prev = number if before: # 1 minuta před, 3 minuty před, 5 minut před / před 1 minutou, před 3 minutami, před 5 minutami if descriptive: - value = inflect_number(number, 'a', 'y', '', unitprefix=unitprefix) + parts.append(inflect_number(number, 'a', 'y', '', unitprefix=unitprefix)) else: - value = inflect_number(number, 'ou', 'ami', 'ami', unitprefix=unitprefix) + parts.append(inflect_number(number, 'ou', 'ami', 'ami', unitprefix=unitprefix)) else: # 1 minuta po, 3 minuty po, 5 minut po / za 1 minutu, za 3 minuty, za 5 minut - value = inflect_number(number, 'a' if descriptive else 'u', 'y', '', unitprefix=unitprefix) + parts.append(inflect_number(number, 'a' if descriptive else 'u', 'y', '', unitprefix=unitprefix)) + value = " ".join(parts) return f"{prefix}{value}{suffix}"