[Python/时间/时区/Utils/DatetimeUtils] Python 时间格式转换

概述:Python 时间格式转换

时间格式指令参数列表

  • 特别注意,这些指令参数仅限于 Python 语言,并不与 Java 等语言一致。

典型如: python 的p 类比 java 的 a
典型如: python 的I 类比 java 的 h (十二小时制的小时)

格式 含义
%Y 四位数的年份表示(000-9999)
%y 两位数的年份表示(00-99)
%m 月份(01 - 12)
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%M 分钟数(00 - 59)
%S 秒(00 - 59)
%X 本地相应时间
%x 本地相应日期
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%p 本地am或者pm的相应符 / 本地A.M.或P.M.的等价符(样例值:"am" / "pm";一般搭配%I 共同使用)
%U 一年中的星期数。(00 - 53,星期天是一个星期的开始。)
%w 一个星期中的第几天(0 - 6,0是星期天)
%W 一年中的星期数(00-53)星期一为星期的开始
和%U基本相同,不同的是%W以星期一为一个星期的开始
%Z 当前时区的名称
%% ‘%’字符
  • 更完整的说明参阅:

https://docs.python.org/zh-cn/3/library/datetime.html#strftime-strptime-behavior

  • 样例格式与样例时间
  • %b %d %I:%M:%S.%f %p %Y : May 8 8:21:23.576 pm 2025
  • %Y-%m-%d %H:%M:%S : 2025-03-15 08:00:00
  • %Y-%m-%d %H:%M:%S.%f : 2023-07-02 18:40:00.123000

最佳实践

DatetimeUtils.py

  • requirements.txt
pytz>=2025.2
DateTime>=5.5
  • 核心方法
  • datetimeStrToTimestamp(datetimeStr, datetimeFormat="%b %d %I:%M:%S.%f %p %Y", timezoneStr="Asia/Shanghai")
  • timestampToDatetimeStr(timestampMs, timeZone='UTC', datetimeFormat='%Y-%m-%d %H:%M:%S.%f')
  • getTimestamp() : 获取当前时间戳(毫秒级)
import datetime;
import pytz
# from dateutil import parser # pip install python-dateutil
# import re

"""
Python 时间处理工具
@author johnny
@updateTime 2025.7.22 15:18
@note [建议] Python 版本 >= 3.9
"""

"""
时间字符串转毫秒级时间戳
@sample 
  timestamp = datetimeStrToTimestamp("May 8 8:21:23.576 pm 2025")
  1746706883576 # Asia/Shanghai (2025-05-08 20:21:23.576)
  1746750083576 # America/New_York (2025-05-08 20:21:23.576)
"""
def datetimeStrToTimestamp(datetimeStr, datetimeFormat="%b %d %I:%M:%S.%f %p %Y", timezoneStr="Asia/Shanghai"):
    # 解析日期时间字符串 (注意: %p 需要配合 %I 使用,而非 %H )
    # 错误示范:"May 8 20:21:23.576 pm 2025",但 20:21 是 24 小时制,与 pm (12 小时制) 矛盾。
    # 正确示范: "May 8 08:21:23.576 pm 2025" 或 "May 8 20:21:23.576 2025"
    # 假设实际是 12 小时制,例如 "May 8 8:21:23.576 pm 2025",这里按 12 小时制处理
    # 如果确实是 24 小时制,去掉 %p 并用 %H 替代 %I

    dt = datetime.datetime.strptime(datetimeStr, datetimeFormat)

    # 获取指定时区
    tz = pytz.timezone(timezoneStr)

    # 本地化时间(假设输入时间是 naive 时间,需要附加时区信息)
    localizedDateTime = tz.localize(dt)

    # 转换为 UTC 时间戳(毫秒)
    timestampMs = int(localizedDateTime.timestamp() * 1000)
    return timestampMs

"""
计算指定的毫秒级时间戳距1970-01-01(时间戳=0)的天数
@note 毫秒级时间戳,一般是 13 位的长整型
@usage
    getDays(0) = 0.0
    getDays(1696500000000) = 19635.42 即 当前时间戳与UTC时间戳0的天数差值为 19635.42
"""
def getDays(timestampMs):
    ## timestampMs = time.mktime(time.strptime("2025-03-15 08:00:00", "%Y-%m-%d %H:%M:%S")) # 1742025600.0 UTC+0 / 1741996800.0 UTC+8
    # timestampMs = 1696500000000  # time.time()
    # print("ts: ", timestampMs)  # 1696500000000

    daysDiff = timestampMs / 86400/ 1000  # 86400 = 24*60*60
    result = round(daysDiff, 2)
    return result;


"""
毫秒级时间戳转时间字符串
@usage
  timestampToDatetimeStr(0) = '1970-01-01 00:00:00.000000'
  timestampToDatetimeStr(0, 'Asia/Shanghai') = '1970-01-01 08:00:00.000000'
  timestampToDatetimeStr(1688294400123, 'UTC') = '2023-07-02 10:40:00.123000'
  timestampToDatetimeStr(1688294400123, 'Asia/Shanghai') = '2023-07-02 18:40:00.123000'
  timestampToDatetimeStr(ts, 'America/New_York', datetimeFormat='%Y-%m-%d %H:%M:%S.%f')[:-3] = '2023-07-02 06:40:00.123'
    注: 去掉最后 3 位微秒,只保留毫秒
"""
def timestampToDatetimeStr(timestampMs, timeZone='UTC', datetimeFormat='%Y-%m-%d %H:%M:%S.%f') -> str:
    """
    毫秒级时间戳(int/float/str) → 指定时区指定格式的时间字符串

    :param ms_ts: 毫秒级时间戳
    :param tz_str: 时区字符串,如 'UTC', 'Asia/Shanghai', 'America/New_York'
    :param fmt: 时间格式字符串
    :return: 格式化后的时间字符串
    """
    # 1. 毫秒转秒
    sec_ts = int(timestampMs) / 1000

    # 2. 时间戳 → UTC 时间
    utcDatetime = datetime.datetime.fromtimestamp(sec_ts, tz= datetime.timezone.utc)

    # 3. UTC 时间 → 目标时区时间
    target_tz = pytz.timezone(timeZone)
    localDatetime = utcDatetime.astimezone(target_tz)

    # 4. 格式化输出
    return localDatetime.strftime(datetimeFormat)


"""
获取当前时间戳(毫秒级)
"""
def getTimestamp():
    timestamp = datetime.datetime.now().timestamp() # eg: 1721601234.56789
    return int( timestamp * 1000 );

推荐文献

  • Python 官网
  • Python 第三方库
  • datetime
  • pytz
  • time : Python 内置模块
  • dateutil : pip install python-dateutil

X 参考文献

暂无

posted @ 2025-03-16 13:36  千千寰宇  阅读(96)  评论(0)    收藏  举报