6 from datetime import datetime
11 logger = logging.getLogger(__file__)
14 def timestamp() -> str:
15 t = datetime.fromtimestamp(time.time())
16 return t.strftime("%d/%b/%Y:%H:%M:%S%Z")
19 def describe_age_of_file(filename: str) -> str:
22 ts = os.stat(filename).st_ctime
25 return describe_duration(age)
26 except Exception as e:
31 def describe_age_of_file_briefly(filename: str) -> str:
34 ts = os.stat(filename).st_ctime
37 return describe_duration_briefly(age)
38 except Exception as e:
43 def describe_duration(age: int) -> str:
44 days = divmod(age, constants.seconds_per_day)
45 hours = divmod(days[1], constants.seconds_per_hour)
46 minutes = divmod(hours[1], constants.seconds_per_minute)
50 descr = f"{int(days[0]):d} days, "
54 descr = descr + f"{int(hours[0]):d} hours, "
56 descr = descr + "1 hour, "
58 descr = descr + "and "
60 descr = descr + "1 minute"
62 descr = descr + f"{int(minutes[0]):d} minutes"
66 def describe_duration_briefly(age: int) -> str:
67 days = divmod(age, constants.seconds_per_day)
68 hours = divmod(days[1], constants.seconds_per_hour)
69 minutes = divmod(hours[1], constants.seconds_per_minute)
73 descr = f"{int(days[0]):d}d "
75 descr = descr + f"{int(hours[0]):d}h "
76 descr = descr + f"{int(minutes[0]):d}m"
80 def minute_number(hour: int, minute: int) -> int:
81 """Convert hour:minute into minute number from start of day."""
82 return hour * 60 + minute
85 def datetime_to_minute_number(dt: datetime) -> int:
86 """Convert a datetime into a minute number (of the day)"""
87 return minute_number(dt.hour, dt.minute)
90 def minute_number_to_time_string(minute_num: int) -> str:
91 """Convert minute number from start of day into hour:minute am/pm
94 hour = minute_num // 60
95 minute = minute_num % 60
104 return f"{hour:2}:{minute:02}{ampm}"
107 # x = describe_age_of_file_briefly("pages/clock_10_none.html")