杰瑞科技汇

Python datetime 函数如何正确使用?

模块概览

datetime 模块主要包含以下几个类:

Python datetime 函数如何正确使用?-图1
(图片来源网络,侵删)
  1. datetime: 这是最常用的类,它包含了日期和时间信息(年、月、日、时、分、秒、微秒)。
  2. date: 只包含日期信息(年、月、日)。
  3. time: 只包含时间信息(时、分、秒、微秒)。
  4. timedelta: 表示两个 datetime 对象之间的时间差(持续时间)。
  5. tzinfo: 时区信息的抽象基类,通常我们使用其子类 timezone 来处理时区。

datetime 类 - 核心操作

创建 datetime 对象

你可以通过多种方式创建 datetime 对象。

a) 获取当前日期和时间

使用 datetime.now(),它会返回一个包含本地时区信息的 datetime 对象。

from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前时间: {now}")
print(f"类型: {type(now)}")
# 输出示例:
# 当前时间: 2025-10-27 15:30:45.123456
# 类型: <class 'datetime.datetime'>

如果你需要获取 UTC(协调世界时)时间,使用 datetime.utcnow()

Python datetime 函数如何正确使用?-图2
(图片来源网络,侵删)
utc_now = datetime.utcnow()
print(f"当前UTC时间: {utc_now}")

b) 从字符串创建 datetime 对象

使用 datetime.strptime()(parse time 的缩写),你需要提供一个格式字符串来匹配输入的日期时间字符串。

from datetime import datetime
# 字符串 -> datetime
date_string = "2025-10-27 15:30:00"
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"转换后的datetime对象: {dt_object}")
print(f"类型: {type(dt_object)}")
# 输出示例:
# 转换后的datetime对象: 2025-10-27 15:30:00
# 类型: <class 'datetime.datetime'>

常用格式化符号:

符号 含义 示例
%Y 4位数字的年份 2025
%m 2位数字的月份 10
%d 2位数字的日 27
%H 24小时制的小时 (0-23) 15
%I 12小时制的小时 (1-12) 03
%M 分钟 (0-59) 30
%S 秒 (0-59) 00
%f 微秒 (0-999999) 123456
%A 本地化的星期名称 Friday
%B 本地化的月份名称 October

c) 从整数创建 datetime 对象

Python datetime 函数如何正确使用?-图3
(图片来源网络,侵删)

使用 datetime() 构造函数直接传入年、月、日等参数。

from datetime import datetime
# 直接构造
dt_custom = datetime(2025, 10, 27, 10, 30, 0)
print(f"自定义时间: {dt_custom}")
# 输出示例:
# 自定义时间: 2025-10-27 10:30:00

datetime 对象的属性

一旦你有了 datetime 对象,就可以轻松访问其各个部分。

dt = datetime(2025, 10, 27, 15, 45, 30, 500000)
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日期: {dt.day}")
print(f"小时: {dt.hour}")
print(f"分钟: {dt.minute}")
print(f"秒: {dt.second}")
print(f"微秒: {dt.microsecond}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}") # 注意:weekday() 返回 0-6
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}") # isoweekday() 返回 1-7

datetime 对象的格式化与解析

a) 将 datetime 对象转为字符串

使用 strftime()(format time 的缩写)。

from datetime import datetime
now = datetime.now()
# 格式化为字符串
formatted_string = now.strftime("%Y年%m月%d日 %H:%M:%S")
print(f"格式化后的字符串: {formatted_string}")
# 输出示例 (取决于当前时间):
# 格式化后的字符串: 2025年10月27日 15:45:30

b) 将字符串转为 datetime 对象

这就是前面提到的 strptime()

date_str = "2025-12-25"
dt_object = datetime.strptime(date_str, "%Y-%m-%d")
print(f"从字符串转换: {dt_object}")

datetime

date

只处理日期。

from datetime import date, time
# 获取当前日期
today = date.today()
print(f"今天日期: {today}")
# 创建特定日期
birthday = date(1990, 5, 15)
print(f"生日: {birthday}")
# 访问属性
print(f"年份: {birthday.year}, 月份: {birthday.month}, 日期: {birthday.day}")
# 格式化
print(f"格式化 (ISO): {birthday.isoformat()}") # 输出: 1990-05-15

time

只处理时间。

from datetime import time
# 创建特定时间
lunch_time = time(12, 30, 0)
print(f"午餐时间: {lunch_time}")
# 创建带微秒的时间
meeting_time = time(14, 0, 0, 500000)
print(f"会议时间: {meeting_time}")
# 访问属性
print(f"小时: {meeting_time.hour}, 分钟: {meeting_time.minute}")

timedelta 类 - 时间计算

timedelta 用于表示一个时间间隔,常用于日期时间的加减运算。

from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差:1天
one_day = timedelta(days=1)
# 计算明天和昨天
tomorrow = now + one_day
yesterday = now - one_day
print(f" {now}")
print(f"明天: {tomorrow}")
print(f"昨天: {yesterday}")
# 创建更复杂的时间差
two_weeks_and_three_hours = timedelta(weeks=2, hours=3)
future_date = now + two_weeks_and_three_hours
print(f"两周三小时后: {future_date}")

重要提示: timedelta 的内部单位是“天”和“秒”,当你用 timedelta(days=1) 时,它表示的是精确的 24 小时,在夏令时等情况下,这可能会导致本地时间出现不连续的跳变(凌晨 2 点跳到凌晨 3 点),但在绝大多数业务场景下,这种影响可以忽略。


时区处理 (Timezones)

处理时区是编程中的一个重要环节,Python 3.2+ 的 datetime 模块内置了 timezone 类来简化时区操作。

a) 使用 UTC 时区

from datetime import datetime, timezone, timedelta
# 创建一个带 UTC 时区的 datetime 对象
utc_now = datetime.now(timezone.utc)
print(f"当前UTC时间: {utc_now}")
# 输出示例:
# 当前UTC时间: 2025-10-27 07:45:30.123456+00:00

b) 创建带特定时区的 datetime 对象

# 创建一个东八区 (UTC+8) 的时区对象
tz_beijing = timezone(timedelta(hours=8))
# 创建一个带有时区信息的 datetime
beijing_time = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_beijing)
print(f"北京时间: {beijing_time}")
# 使用 pytz 库 (更强大,推荐)
# pip install pytz
import pytz
tz_shanghai = pytz.timezone('Asia/Shanghai')
shanghai_time = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_shanghai)
print(f"上海时间: {shanghai_time}")

c) 时区转换

时区转换的关键是先将 datetime 对象转换为 UTC 时间(如果它不是),然后从 UTC 时间转换到目标时区。

from datetime import datetime, timezone
import pytz
# 假设我们有一个纽约时间
tz_ny = pytz.timezone('America/New_York')
ny_time = datetime(2025, 10, 27, 10, 30, 0, tzinfo=tz_ny)
print(f"纽约时间: {ny_time}")
# 1. 将纽约时间转换为 UTC
# astimezone() 会自动处理时区转换
utc_time = ny_time.astimezone(timezone.utc)
print(f"对应的UTC时间: {utc_time}")
# 2. 将 UTC 时间转换为北京时间
tz_beijing = pytz.timezone('Asia/Shanghai')
beijing_time = utc_time.astimezone(tz_beijing)
print(f"对应的北京时间: {beijing_time}")

实用示例

示例 1: 计算两个日期之间的天数差

from datetime import datetime
start_date = datetime(2025, 1, 1)
end_date = datetime(2025, 12, 31)
time_difference = end_date - start_date
print(f"从 {start_date} 到 {end_date} 的天数差是: {time_difference.days} 天")

示例 2: 计算年龄

from datetime import datetime
def calculate_age(birth_date_str):
    birth_date = datetime.strptime(birth_date_str, "%Y-%m-%d")
    today = datetime.now()
    # 先计算年份差
    age = today.year - birth_date.year
    # 如果今年的生日还没到,年龄减1
    if (today.month, today.day) < (birth_date.month, birth_date.day):
        age -= 1
    return age
age = calculate_age("1990-05-15")
print(f"你的年龄是: {age} 岁")

示例 3: 判断是否为工作日

from datetime import datetime
def is_weekend(dt):
    # weekday() 返回 0-6 (0是周一)
    return dt.weekday() >= 5
now = datetime.now()
if is_weekend(now):
    print("今天是周末!")
else:
    print("今天是工作日。")

功能 函数/方法 描述
创建对象 datetime.now() 获取当前本地 datetime
datetime.utcnow() 获取当前 UTC datetime
datetime.strptime(s, fmt) 从字符串解析 datetime
datetime(y, m, d, ...) 直接构造 datetime
格式化/解析 dt_object.strftime(fmt) datetime 格式化为字符串
dt_object.strptime(s, fmt) 将字符串解析为 datetime
属性访问 dt_object.year, .month, ... 访问年、月、日、时等属性
时间计算 datetime + timedelta 加上时间间隔
datetime - timedelta 减去时间间隔
dt1 - dt2 计算两个 datetime 的时间差 (timedelta 对象)
时区 dt.astimezone(tz) 转换时区
pytz.timezone('...') (使用 pytz 库) 获取特定时区

datetime 模块功能强大,是 Python 中处理时间相关任务不可或缺的工具,掌握它的基本用法会让你在处理日期、时间、时间差和时区问题时游刃有余。

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