Python将字符串转换为datetime

有这样一些字符串:

python 复制代码
'1710903685'
'20240320110125'
'2024-03-20 11:01:25'

要转换成Python的datetime

代码如下:

python 复制代码
import functools
import re
from datetime import datetime, timedelta
from typing import Union

# pip install python-dateutil
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__":  # pragma: no cover
    _test()

函数和单元测试都写好后,发现有些字符串是UTC时间,于是增加了装饰器和is_utc参数来转成北京时间.

单元测试结果如下:

相关推荐
第二只羽毛5 分钟前
C++ 高并发内存池1
大数据·开发语言·c++·开源
不想看见40413 分钟前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
智算菩萨17 分钟前
【OpenGL】10 完整游戏开发实战:基于OpenGL的2D/3D游戏框架、物理引擎集成与AI辅助编程指南
人工智能·python·游戏·3d·矩阵·pygame·opengl
sjmaysee31 分钟前
Java框架SpringBoot(一)
java·开发语言·spring boot
寒秋花开曾相惜34 分钟前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
想唱rap41 分钟前
Linux线程
java·linux·运维·服务器·开发语言·mysql
Tony Bai1 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
njidf1 小时前
C++与Qt图形开发
开发语言·c++·算法
qwehjk20081 小时前
代码动态生成技术
开发语言·c++·算法
是翔仔呐1 小时前
第11章 显示外设驱动:I2C协议OLED屏、SPI协议LCD屏字符/图片/中文显示
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee