import functools
import re
from datetime import datetime, timedelta
from typing import Union
from dateutil import parser
def convert_zone(func):
@functools.wraps(func)
def deco(*args, **kw):
is_utc = kw.pop("is_utc", False)
v = func(*args, **kw)
if is_utc:
v += timedelta(hours=8)
return v
return deco
@convert_zone
def parse_time(s: Union[int, float, str], *, is_utc=False) -> datetime:
"""将字符串或数值转换为datetime
Usage::
>>> from datetime import datetime
>>> parse_time(1710903685)
datetime.datetime(2024, 3, 20, 11, 1, 25)
>>> parse_time('1710903685')
datetime.datetime(2024, 3, 20, 11, 1, 25)
>>> parse_time('2024-03-20 11:01:25')
datetime.datetime(2024, 3, 20, 11, 1, 25)
>>> parse_time('20240320110125')
datetime.datetime(2024, 3, 20, 11, 1, 25)
>>> parse_time('20240320110125', is_utc=True)
datetime.datetime(2024, 3, 20, 19, 1, 25)
>>> parse_time(1710903685) == parse_time('1710903685') == parse_time('2024-03-20 11:01:25') == datetime(2024, 3, 20, 11, 1, 25)
True
>>> parse_time(1710903685.780527) == parse_time('1710903685.780527') == parse_time('2024-03-20 11:01:25.780527') == datetime(2024, 3, 20, 11, 1, 25, 780527)
True
>>> now = datetime.now()
>>> timestamp = now.timestamp()
>>> parse_time(str(now)) == now == parse_time(str(timestamp)) == parse_time(timestamp)
True
>>> try:
... parse_time('invalid time')
... except ValueError as e:
... print(e)
...
Can't parse s='invalid time' to datetime
"""
if isinstance(s, (int, float)):
return datetime.fromtimestamp(s)
if s.isdigit():
try:
return datetime.fromtimestamp(int(s))
except ValueError:
pass
if re.match(r"\d+\.\d+$", s):
return datetime.fromtimestamp(float(s))
try:
return parser.parse(s)
except parser.ParserError as e:
raise ValueError(f"Can't parse {s=} to datetime") from e
def _test():
import doctest
doctest.testmod(verbose=True)
if __name__ == "__main__":
_test()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现