mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 17:57:11 +00:00
Round time values in get_age() to better approximate the actual age (#37125)
This commit is contained in:
parent
511da9557b
commit
ef254a1c3d
@ -1,7 +1,7 @@
|
|||||||
"""Helper methods to handle the time in Home Assistant."""
|
"""Helper methods to handle the time in Home Assistant."""
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import re
|
import re
|
||||||
from typing import Any, Dict, List, Optional, Tuple, Union, cast
|
from typing import Any, Dict, List, Optional, Union, cast
|
||||||
|
|
||||||
import ciso8601
|
import ciso8601
|
||||||
import pytz
|
import pytz
|
||||||
@ -176,7 +176,6 @@ def parse_time(time_str: str) -> Optional[dt.time]:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Found in this gist: https://gist.github.com/zhangsen/1199964
|
|
||||||
def get_age(date: dt.datetime) -> str:
|
def get_age(date: dt.datetime) -> str:
|
||||||
"""
|
"""
|
||||||
Take a datetime and return its "age" as a string.
|
Take a datetime and return its "age" as a string.
|
||||||
@ -193,33 +192,21 @@ def get_age(date: dt.datetime) -> str:
|
|||||||
return f"1 {unit}"
|
return f"1 {unit}"
|
||||||
return f"{number:d} {unit}s"
|
return f"{number:d} {unit}s"
|
||||||
|
|
||||||
def q_n_r(first: int, second: int) -> Tuple[int, int]:
|
delta = (now() - date).total_seconds()
|
||||||
"""Return quotient and remaining."""
|
rounded_delta = round(delta)
|
||||||
return first // second, first % second
|
|
||||||
|
|
||||||
delta = now() - date
|
units = ["second", "minute", "hour", "day", "month"]
|
||||||
day = delta.days
|
factors = [60, 60, 24, 30, 12]
|
||||||
second = delta.seconds
|
selected_unit = "year"
|
||||||
|
|
||||||
year, day = q_n_r(day, 365)
|
for i, next_factor in enumerate(factors):
|
||||||
if year > 0:
|
if rounded_delta < next_factor:
|
||||||
return formatn(year, "year")
|
selected_unit = units[i]
|
||||||
|
break
|
||||||
|
delta /= next_factor
|
||||||
|
rounded_delta = round(delta)
|
||||||
|
|
||||||
month, day = q_n_r(day, 30)
|
return formatn(rounded_delta, selected_unit)
|
||||||
if month > 0:
|
|
||||||
return formatn(month, "month")
|
|
||||||
if day > 0:
|
|
||||||
return formatn(day, "day")
|
|
||||||
|
|
||||||
hour, second = q_n_r(second, 3600)
|
|
||||||
if hour > 0:
|
|
||||||
return formatn(hour, "hour")
|
|
||||||
|
|
||||||
minute, second = q_n_r(second, 60)
|
|
||||||
if minute > 0:
|
|
||||||
return formatn(minute, "minute")
|
|
||||||
|
|
||||||
return formatn(second, "second")
|
|
||||||
|
|
||||||
|
|
||||||
def parse_time_expression(parameter: Any, min_value: int, max_value: int) -> List[int]:
|
def parse_time_expression(parameter: Any, min_value: int, max_value: int) -> List[int]:
|
||||||
|
@ -162,6 +162,9 @@ def test_get_age():
|
|||||||
diff = dt_util.now() - timedelta(minutes=320)
|
diff = dt_util.now() - timedelta(minutes=320)
|
||||||
assert dt_util.get_age(diff) == "5 hours"
|
assert dt_util.get_age(diff) == "5 hours"
|
||||||
|
|
||||||
|
diff = dt_util.now() - timedelta(minutes=1.6 * 60 * 24)
|
||||||
|
assert dt_util.get_age(diff) == "2 days"
|
||||||
|
|
||||||
diff = dt_util.now() - timedelta(minutes=2 * 60 * 24)
|
diff = dt_util.now() - timedelta(minutes=2 * 60 * 24)
|
||||||
assert dt_util.get_age(diff) == "2 days"
|
assert dt_util.get_age(diff) == "2 days"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user