Source code for ptyrad.utils.time
"""
Get time from datetime and parse time to string
"""
from typing import Union
[docs]
def get_time(time_format: Union[bool, str, None] = 'date') -> str:
"""
Returns a formatted timestamp string based on `time_format`.
Args:
time_format (bool or str): Controls the time formatting behavior.
- True: Use default date format ("%Y%m%d").
- False, None, or "": Disable timestamp and return an empty string.
- "date": Use date format ("%Y%m%d").
- "datetime": Use date and time format ("%Y%m%d_%H%M%S").
- "time": Use time-only format ("%H%M%S").
- Custom strftime format (e.g., "%Y-%m-%d %H:%M") is also supported.
Returns:
str: Formatted timestamp string, or an empty string if disabled.
"""
from datetime import date, datetime
if not time_format:
return ""
if isinstance(time_format, bool):
fmt = "%Y%m%d"
elif isinstance(time_format, str):
presets = {
"date": "%Y%m%d",
"datetime": "%Y%m%d_%H%M%S",
"time": "%H%M%S",
}
fmt = presets.get(time_format.lower(), time_format)
else:
raise TypeError(f"time_format must be a bool or str, got {type(time_format).__name__}")
# Choose datetime vs date object depending on format
try:
if any(tok in fmt for tok in ("%H", "%M", "%S")):
return datetime.now().strftime(fmt)
else:
return date.today().strftime(fmt)
except ValueError as e:
raise ValueError(f"Invalid time format string: {fmt!r}") from e
[docs]
def parse_sec_to_time_str(seconds):
days = seconds // 86400
hours = (seconds % 86400) // 3600
minutes = (seconds % 3600) // 60
secs = seconds % 60
if days > 0:
return f"{int(days)} day {int(hours)} hr {int(minutes)} min {secs:.3f} sec"
elif hours > 0:
return f"{int(hours)} hr {int(minutes)} min {secs:.3f} sec"
elif minutes > 0:
return f"{int(minutes)} min {secs:.3f} sec"
else:
return f"{secs:.3f} sec"