71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
"""
|
|
DateTime utilities for microservices
|
|
"""
|
|
|
|
from datetime import datetime, timezone, timedelta
|
|
from typing import Optional
|
|
import pytz
|
|
|
|
def utc_now() -> datetime:
|
|
"""Get current UTC datetime"""
|
|
return datetime.now(timezone.utc)
|
|
|
|
def madrid_now() -> datetime:
|
|
"""Get current Madrid datetime"""
|
|
madrid_tz = pytz.timezone('Europe/Madrid')
|
|
return datetime.now(madrid_tz)
|
|
|
|
def to_utc(dt: datetime) -> datetime:
|
|
"""Convert datetime to UTC"""
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
return dt.astimezone(timezone.utc)
|
|
|
|
def to_madrid(dt: datetime) -> datetime:
|
|
"""Convert datetime to Madrid timezone"""
|
|
madrid_tz = pytz.timezone('Europe/Madrid')
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
return dt.astimezone(madrid_tz)
|
|
|
|
def format_datetime(dt: datetime, format_str: str = "%Y-%m-%d %H:%M:%S") -> str:
|
|
"""Format datetime as string"""
|
|
return dt.strftime(format_str)
|
|
|
|
def parse_datetime(dt_str: str, format_str: str = "%Y-%m-%d %H:%M:%S") -> datetime:
|
|
"""Parse datetime from string"""
|
|
return datetime.strptime(dt_str, format_str)
|
|
|
|
def is_business_hours(dt: Optional[datetime] = None) -> bool:
|
|
"""Check if datetime is during business hours (9 AM - 6 PM Madrid time)"""
|
|
if dt is None:
|
|
dt = madrid_now()
|
|
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
|
|
madrid_dt = to_madrid(dt)
|
|
|
|
# Check if it's a weekday (Monday=0, Sunday=6)
|
|
if madrid_dt.weekday() >= 5: # Weekend
|
|
return False
|
|
|
|
# Check if it's business hours
|
|
return 9 <= madrid_dt.hour < 18
|
|
|
|
def next_business_day(dt: Optional[datetime] = None) -> datetime:
|
|
"""Get next business day"""
|
|
if dt is None:
|
|
dt = madrid_now()
|
|
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
|
|
madrid_dt = to_madrid(dt)
|
|
|
|
# Add days until we reach a weekday
|
|
while madrid_dt.weekday() >= 5: # Weekend
|
|
madrid_dt += timedelta(days=1)
|
|
|
|
# Set to 9 AM
|
|
return madrid_dt.replace(hour=9, minute=0, second=0, microsecond=0) |