90 lines
2.3 KiB
Python
90 lines
2.3 KiB
Python
"""统一工具函数"""
|
|
import uuid
|
|
import random
|
|
import string
|
|
from datetime import date, datetime
|
|
from typing import Optional, Union
|
|
|
|
|
|
def generate_uuid() -> str:
|
|
"""生成UUID"""
|
|
return str(uuid.uuid4()).replace("-", "").upper()
|
|
|
|
|
|
def generate_id(prefix: str = "") -> str:
|
|
"""生成带前缀的ID"""
|
|
uid = str(uuid.uuid4()).replace("-", "").upper()
|
|
return f"{prefix}{uid}" if prefix else uid
|
|
|
|
|
|
def generate_random_password(length: int = 8) -> str:
|
|
"""生成随机密码"""
|
|
chars = string.ascii_letters + string.digits
|
|
return ''.join(random.choice(chars) for _ in range(length))
|
|
|
|
|
|
def get_current_time() -> datetime:
|
|
"""获取当前时间"""
|
|
return datetime.now()
|
|
|
|
|
|
def format_datetime(dt: Optional[datetime]) -> Optional[str]:
|
|
"""格式化时间为ISO 8601格式"""
|
|
if dt is None:
|
|
return None
|
|
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
def parse_datetime(dt_str: str) -> Optional[datetime]:
|
|
"""解析ISO 8601格式时间"""
|
|
if not dt_str:
|
|
return None
|
|
try:
|
|
return datetime.fromisoformat(dt_str.replace("Z", "+00:00"))
|
|
except (ValueError, AttributeError):
|
|
return None
|
|
|
|
|
|
def format_date(d: Optional[Union[date, datetime]]) -> str:
|
|
"""格式化日期为 YYYY-MM-DD"""
|
|
if d is None:
|
|
return ""
|
|
if isinstance(d, datetime):
|
|
d = d.date()
|
|
return d.strftime("%Y-%m-%d")
|
|
|
|
|
|
def parse_date(date_str: str) -> Optional[date]:
|
|
"""解析 YYYY-MM-DD 日期"""
|
|
if not date_str:
|
|
return None
|
|
try:
|
|
s = str(date_str).strip()
|
|
if not s:
|
|
return None
|
|
return datetime.fromisoformat(s[:10]).date()
|
|
except (ValueError, AttributeError):
|
|
return None
|
|
|
|
|
|
def optional_date(v: object) -> Optional[date]:
|
|
"""将字符串 / date / datetime 转为 date 或 None"""
|
|
if v is None or v == "":
|
|
return None
|
|
if isinstance(v, datetime):
|
|
return v.date()
|
|
if isinstance(v, date):
|
|
return v
|
|
return parse_date(str(v))
|
|
|
|
|
|
def get_file_size_display(size_bytes: int) -> str:
|
|
"""将字节数转换为可读的文件大小"""
|
|
if size_bytes is None:
|
|
return "0 B"
|
|
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
|
|
if size_bytes < 1024.0:
|
|
return f"{size_bytes:.2f} {unit}"
|
|
size_bytes /= 1024.0
|
|
return f"{size_bytes:.2f} PB"
|