Coverage for health / utils / date_utils.py: 0%
22 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-02 17:44 +0800
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-02 17:44 +0800
1"""
2Date utility functions for health data sync.
3"""
5from datetime import date, datetime, timedelta
6from typing import List, Tuple
9def parse_date(date_str: str) -> date:
10 """Parse date string in YYYY-MM-DD format.
12 Args:
13 date_str: Date string to parse
15 Returns:
16 Parsed date object
18 Raises:
19 ValueError: If date string is invalid
20 """
21 try:
22 return datetime.strptime(date_str, "%Y-%m-%d").date()
23 except ValueError as e:
24 raise ValueError(f"Invalid date format '{date_str}'. Expected YYYY-MM-DD.") from e
27def date_range(start: date, end: date) -> List[date]:
28 """Generate list of dates between start and end (inclusive).
30 Args:
31 start: Start date
32 end: End date
34 Returns:
35 List of dates from start to end
36 """
37 days = (end - start).days + 1
38 return [start + timedelta(days=i) for i in range(days)]
41def split_date_range(
42 start: date, end: date, batch_size: int = 30
43) -> List[Tuple[date, date]]:
44 """Split a date range into smaller batches.
46 Args:
47 start: Start date
48 end: End date
49 batch_size: Maximum days per batch (default: 30)
51 Returns:
52 List of (batch_start, batch_end) tuples
53 """
54 batches = []
55 current = start
57 while current <= end:
58 batch_end = min(current + timedelta(days=batch_size - 1), end)
59 batches.append((current, batch_end))
60 current = batch_end + timedelta(days=1)
62 return batches
65def get_yesterday() -> date:
66 """Get yesterday's date.
68 Returns:
69 Yesterday's date
70 """
71 return date.today() - timedelta(days=1)
74def format_date(d: date) -> str:
75 """Format date as YYYY-MM-DD string.
77 Args:
78 d: Date to format
80 Returns:
81 Formatted date string
82 """
83 return d.strftime("%Y-%m-%d")