Files
datediff/datediff.py
Кокос Артем Николаевич 004acf99d9 Initial commit
2026-01-21 15:58:31 +07:00

83 lines
2.7 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Утилита для вычисления разницы между двумя датами.
Поддерживает:
- Разницу в днях и полных годах.
- Автоматическое сравнение с текущей датой при указании одной даты.
Формат даты: YYYY-MM-DD
"""
import sys
from datetime import date, datetime
def parse_date(date_str: str) -> date:
"""Преобразует строку вида 'YYYY-MM-DD' в объект date."""
if not isinstance(date_str, str):
raise TypeError("Ожидалась строка с датой")
return datetime.strptime(date_str.strip(), "%Y-%m-%d").date()
def years_between(start: date, end: date) -> int:
"""
Возвращает количество полных лет между двумя датами.
Учитывает високосные годы (например, 29 февраля).
"""
if start > end:
start, end = end, start
try:
candidate = start.replace(year=end.year)
except ValueError:
# Обработка 29 февраля в невисокосный год
candidate = start.replace(year=end.year, day=28)
years = end.year - start.year
if candidate > end:
years -= 1
return years
def days_between(start: date, end: date) -> int:
"""Возвращает абсолютное количество дней между двумя датами."""
return abs((end - start).days)
def diff_dates(d1: date, d2: date) -> tuple[int, int]:
"""
Возвращает кортеж (дней, полных лет) между двумя датами.
Порядок дат не важен — результат всегда положительный.
"""
days = days_between(d1, d2)
years = years_between(d1, d2)
return days, years
def main() -> None:
args = sys.argv[1:]
if not args or len(args) > 2:
print("Использование:", file=sys.stderr)
print(" datediff <дата> # от даты до сегодня", file=sys.stderr)
print(" datediff <дата1> <дата2> # между двумя датами", file=sys.stderr)
print("Формат даты: YYYY-MM-DD", file=sys.stderr)
sys.exit(1)
try:
d1 = parse_date(args[0])
d2 = parse_date(args[1]) if len(args) == 2 else date.today()
except (ValueError, TypeError) as e:
print(f"Ошибка: неверный формат даты — {e}", file=sys.stderr)
sys.exit(1)
days, years = diff_dates(d1, d2)
print(f"Дней: {days}, Полных лет: {years}")
if __name__ == "__main__":
main()