杰瑞科技汇

Python datetime 格式如何自定义?

datetime 模块是 Python 处理日期和时间的主要工具,其核心功能之一就是格式化(将 datetime 对象转换为字符串)和解析(将字符串转换为 datetime 对象)。

Python datetime 格式如何自定义?-图1
(图片来源网络,侵删)

格式化:strftime() 方法

strftime() 的全称是 "String Format Time",意为“字符串格式化时间”,它是一个 datetime 对象的方法,用于将日期和时间信息格式化为指定的字符串。

语法: datetime_object.strftime(format_code)

format_code 是由各种格式代码组成的字符串,这些代码以 开头。

常用格式代码表

代码 含义 示例
%Y 四位数的年份 2025
%y 两位数的年份 23
%m 两位数的月份 (01-12) 09
%B 月份的全称 September
%b 月份的简称 Sep
%d 两位数的日期 (01-31) 07
%A 星期几的全称 Thursday
%a 星期几的简称 Thu
%H 24小时制的小时 (00-23) 14
%I 12小时制的小时 (01-12) 02
%M 两位数的分钟 (00-59) 30
%S 两位数的秒 (00-59) 05
%f 微秒 (000000-999999) 123456
%p 本地 A.M. 或 P.M. 的标识 PM
%j 一年中的第几天 (001-366) 250
%U 一年中的第几周(周日为一周的第一天) 36
%W 一年中的第几周(周一为一周的第一天) 36
%c 本地的日期和时间表示 Thu Sep 7 14:30:05 2025
%x 本地的日期表示 09/07/23
%X 本地的时间表示 14:30:05
一个普通的 字符

解析:strptime() 方法

strptime() 的全称是 "String Parse Time",意为“字符串解析时间”,它是 datetime 模块中的一个函数,用于根据指定的格式字符串,将日期时间字符串解析为 datetime 对象。

Python datetime 格式如何自定义?-图2
(图片来源网络,侵删)

语法: datetime.strptime(date_string, format_code)

  • date_string: 要解析的日期时间字符串。
  • format_code: 描述 date_string 格式的代码,与 strftime() 中的代码相同。

综合示例

下面是一个完整的例子,展示了如何创建 datetime 对象,以及如何进行格式化和解析。

import datetime
# 1. 创建一个 datetime 对象
# 使用当前时间
now = datetime.datetime.now()
print(f"当前的 datetime 对象: {now}")
# 输出: 当前的 datetime 对象: 2025-09-07 14:30:05.123456
# 使用指定时间创建
specific_date = datetime.datetime(2025, 10, 27, 10, 30, 0)
print(f"指定的 datetime 对象: {specific_date}")
# 输出: 指定的 datetime 对象: 2025-10-27 10:30:00
# 2. 格式化: 使用 strftime()
# 示例 1: 标准格式 "YYYY-MM-DD HH:MM:SS"
formatted_standard = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"标准格式: {formatted_standard}")
# 输出: 标准格式: 2025-09-07 14:30:05
# 示例 2: "YYYY年MM月DD日 HH时MM分SS秒"
formatted_chinese = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"中文格式: {formatted_chinese}")
# 输出: 中文格式: 2025年09月07日 14时30分05秒
# 示例 3: "YYYY/MM/DD (星期X)"
formatted_weekday = now.strftime("%Y/%m/%d (%a)")
print(f"带星期的格式: {formatted_weekday}")
# 输出: 带星期的格式: 2025/09/07 (Thu)
# 示例 4: "YYYY-MM-DD HH:MM:SS.ffffff"
formatted_with_microseconds = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(f"带微秒的格式: {formatted_with_microseconds}")
# 输出: 带微秒的格式: 2025-09-07 14:30:05.123456
# 3. 解析: 使用 strptime()
# 假设我们有一个日期时间字符串
date_string = "2025-10-27 15:45:30"
# 使用对应的格式代码来解析它
parsed_datetime = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"\n原始字符串: '{date_string}'")
print(f"解析后的 datetime 对象: {parsed_datetime}")
print(f"解析后的对象类型: {type(parsed_datetime)}")
# 输出:
# 原始字符串: '2025-10-27 15:45:30'
# 解析后的 datetime 对象: 2025-10-27 15:45:30
# 解析后的对象类型: <class 'datetime.datetime'>
# 另一个例子:解析不同格式的字符串
date_string_2 = "27/Oct/2025, 10:30 AM"
parsed_datetime_2 = datetime.datetime.strptime(date_string_2, "%d/%b/%Y, %I:%M %p")
print(f"\n解析字符串: '{date_string_2}'")
print(f"解析结果: {parsed_datetime_2}")
# 输出:
# 解析字符串: '27/Oct/2025, 10:30 AM'
# 解析结果: 2025-10-27 10:30:00

常见错误与注意事项

  1. 格式代码不匹配 这是最常见的错误。strptime() 中提供的格式代码必须与字符串的格式完全对应,否则会抛出 ValueError

    # 错误示例:月份是数字但格式代码用了%B
    try:
        # 字符串中月份是 "09",但格式代码 %B 期望 "September"
        datetime.datetime.strptime("2025-09-07", "%Y-%B-%d")
    except ValueError as e:
        print(f"错误: {e}")
        # 输出: 错: time data '2025-09-07' does not match format '%Y-%B-%d'
    # 正确示例
    correct_date = datetime.datetime.strptime("2025-09-07", "%Y-%m-%d")
    print(f"正确解析: {correct_date}")
    # 输出: 正确解析: 2025-09-07 00:00:00
  2. 时区问题 datetime.datetime 对象本身可以是无时区的(naive),也可以是带时区的(aware)。strftimestrptime 默认处理的是本地时区或无时区信息。

    • 如果你的字符串包含时区信息(如 +08:00, UTC, EST),你需要使用 pytz 或 Python 3.9+ 内置的 zoneinfo 模块来正确解析。
    • now.strftime(...) 会输出本地时区的时间。
    # Python 3.9+ 使用 zoneinfo
    # from zoneinfo import ZoneInfo
    # tz = ZoneInfo("Asia/Shanghai")
    # aware_now = datetime.datetime.now(tz)
    # print(aware_now.strftime("%Y-%m-%d %H:%M:%S %Z"))
    # 输出: 2025-09-07 14:30:05 CST
  3. 性能 对于大量的日期时间处理,频繁地调用 strptime 可能会成为性能瓶颈,在这种情况下,可以考虑使用第三方库如 dateutil.parser,它更灵活,但可能稍慢。

    # 使用 dateutil.parser (需要安装: pip install python-dateutil)
    from dateutil import parser
    # 它能自动识别多种常见格式
    date_string_3 = "Oct 27, 2025"
    date_string_4 = "2025/10/27 10:30"
    parsed_3 = parser.parse(date_string_3)
    parsed_4 = parser.parse(date_string_4)
    print(f"\n使用 dateutil 解析: {date_string_3} -> {parsed_3}")
    print(f"使用 dateutil 解析: {date_string_4} -> {parsed_4}")

其他相关类

  • date: 仅处理日期(年、月、日),同样有 strftime()strptime() 方法。
  • time: 仅处理时间(时、分、秒、微秒、时区)。
  • timedelta: 表示两个日期或时间之间的差值(时间间隔)。
from datetime import date, time, timedelta
# date 示例
today = date.today()
print(f"\n今天的日期 (date 对象): {today}")
print(f"格式化后的日期: {today.strftime('%Y年%m月%d日')}")
# time 示例
current_time = time(14, 30, 5)
print(f"\n当前的时间 (time 对象): {current_time}")
print(f"格式化后的时间: {current_time.strftime('%H:%M:%S')}")
# timedelta 示例
from datetime import datetime
one_day_later = datetime.now() + timedelta(days=1)
print(f"\n一天后的时间: {one_day_later}")
操作 方法/函数 描述
格式化 datetime_object.strftime(format) datetime 对象转换为字符串。
解析 datetime.strptime(string, format) 将字符串转换为 datetime 对象。
获取当前时间 datetime.datetime.now() 获取当前的本地 datetime 对象。
获取当前日期 datetime.date.today() 获取当前的本地 date 对象。

strftimestrptime 是核心,它们的格式代码是相通的,多练习几次,就能熟练掌握 Python 日期时间的格式化与解析。

分享:
扫描分享到社交APP
上一篇
下一篇