| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- """统一工具函数"""
- 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"
|