[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 第三方库
datetimepytztime: Python 内置模块dateutil:pip install python-dateutil
- [javascript] 日期计算:计算距 1970-01-01 的天数 - 博客园/千千寰宇
- 在线运行 Python - 菜鸟教程
- [Linux/MYSQL/Java] 时间与时区(UTC/GMT/CST/Timestamp) - 博客园/千千寰宇
X 参考文献
暂无
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号