51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""数据类型解析器"""
|
|
from datetime import datetime
|
|
from decimal import Decimal, ROUND_HALF_UP
|
|
from dateutil import parser as dtparser
|
|
from zoneinfo import ZoneInfo
|
|
|
|
class TypeParser:
|
|
"""类型解析工具"""
|
|
|
|
@staticmethod
|
|
def parse_timestamp(s: str, tz: ZoneInfo) -> datetime | None:
|
|
"""解析时间戳"""
|
|
if not s:
|
|
return None
|
|
try:
|
|
dt = dtparser.parse(s)
|
|
if dt.tzinfo is None:
|
|
return dt.replace(tzinfo=tz)
|
|
return dt.astimezone(tz)
|
|
except Exception:
|
|
return None
|
|
|
|
@staticmethod
|
|
def parse_decimal(value, scale: int = 2) -> Decimal | None:
|
|
"""解析金额"""
|
|
if value is None:
|
|
return None
|
|
try:
|
|
d = Decimal(str(value))
|
|
return d.quantize(Decimal(10) ** -scale, rounding=ROUND_HALF_UP)
|
|
except Exception:
|
|
return None
|
|
|
|
@staticmethod
|
|
def parse_int(value) -> int | None:
|
|
"""解析整数"""
|
|
if value is None:
|
|
return None
|
|
try:
|
|
return int(value)
|
|
except Exception:
|
|
return None
|
|
|
|
@staticmethod
|
|
def format_timestamp(dt: datetime | None, tz: ZoneInfo) -> str | None:
|
|
"""格式化时间戳"""
|
|
if not dt:
|
|
return None
|
|
return dt.astimezone(tz).strftime("%Y-%m-%d %H:%M:%S")
|