1e3dc11d59
feat(test-suite): 新增测试套件模块,包含API测试客户端和测试配置 fix(api): 修复数据库实体和仓库的删除操作返回值 style(api): 统一数据库表名和字段命名 perf(api): 添加缓存注解提升配置查询性能 test(api): 添加H2测试数据库配置支持 chore: 清理旧的测试文件和脚本
116 lines
2.7 KiB
Python
116 lines
2.7 KiB
Python
"""
|
|
日期时间工具类
|
|
|
|
提供日期时间相关的工具方法
|
|
|
|
作者: 张翔
|
|
日期: 2026-04-01
|
|
"""
|
|
|
|
from datetime import datetime, timedelta
|
|
from typing import Optional
|
|
import pytz
|
|
|
|
|
|
class DateHelper:
|
|
"""日期时间工具类"""
|
|
|
|
@staticmethod
|
|
def format_datetime(dt: datetime, fmt: str = "%Y-%m-%d %H:%M:%S") -> str:
|
|
"""
|
|
格式化日期时间
|
|
|
|
Args:
|
|
dt: datetime对象
|
|
fmt: 格式字符串
|
|
|
|
Returns:
|
|
格式化后的字符串
|
|
"""
|
|
if dt is None:
|
|
return ""
|
|
return dt.strftime(fmt)
|
|
|
|
@staticmethod
|
|
def parse_datetime(date_string: str, fmt: str = "%Y-%m-%d %H:%M:%S") -> Optional[datetime]:
|
|
"""
|
|
解析日期时间字符串
|
|
|
|
Args:
|
|
date_string: 日期时间字符串
|
|
fmt: 格式字符串
|
|
|
|
Returns:
|
|
datetime对象,解析失败返回None
|
|
"""
|
|
try:
|
|
return datetime.strptime(date_string, fmt)
|
|
except (ValueError, TypeError):
|
|
return None
|
|
|
|
@staticmethod
|
|
def days_between(start_date: datetime, end_date: datetime) -> int:
|
|
"""
|
|
计算两个日期之间的天数
|
|
|
|
Args:
|
|
start_date: 开始日期
|
|
end_date: 结束日期
|
|
|
|
Returns:
|
|
天数差
|
|
"""
|
|
if start_date is None or end_date is None:
|
|
return 0
|
|
delta = end_date - start_date
|
|
return delta.days
|
|
|
|
@staticmethod
|
|
def utc_to_local(utc_time: datetime, timezone: str = "Asia/Shanghai") -> datetime:
|
|
"""
|
|
UTC时间转本地时间
|
|
|
|
Args:
|
|
utc_time: UTC时间
|
|
timezone: 时区名称
|
|
|
|
Returns:
|
|
本地时间
|
|
"""
|
|
if utc_time is None:
|
|
return None
|
|
|
|
utc_tz = pytz.UTC
|
|
local_tz = pytz.timezone(timezone)
|
|
|
|
if utc_time.tzinfo is None:
|
|
utc_time = utc_tz.localize(utc_time)
|
|
|
|
return utc_time.astimezone(local_tz)
|
|
|
|
@staticmethod
|
|
def get_current_timestamp() -> int:
|
|
"""
|
|
获取当前时间戳(秒)
|
|
|
|
Returns:
|
|
当前时间戳
|
|
"""
|
|
return int(datetime.now().timestamp())
|
|
|
|
@staticmethod
|
|
def add_days(dt: datetime, days: int) -> datetime:
|
|
"""
|
|
日期加减天数
|
|
|
|
Args:
|
|
dt: 日期
|
|
days: 天数(可为负数)
|
|
|
|
Returns:
|
|
新日期
|
|
"""
|
|
if dt is None:
|
|
return None
|
|
return dt + timedelta(days=days)
|