杰瑞科技汇

Python datetime 如何计算时间差?

datetime 模块主要包含以下几个核心对象:

Python datetime 如何计算时间差?-图1
(图片来源网络,侵删)
  1. datetime: 最常用的类,同时包含日期和时间信息。
  2. date: 只包含日期信息(年、月、日)。
  3. time: 只包含时间信息(时、分、秒、微秒)。
  4. timedelta: 表示时间差,用于进行时间的加减运算。
  5. tzinfo: 时区信息的抽象基类,用于处理不同时区。

获取当前日期和时间

这是最常见的操作,使用 datetime.now()

from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前完整日期和时间: {now}")
print(f"当前日期: {now.date()}")
print(f"当前时间: {now.time()}")
# 输出示例 (运行时会显示当前实际时间):
# 当前完整日期和时间: 2025-10-27 15:30:45.123456
# 当前日期: 2025-10-27
# 当前时间: 15:30:45.123456

创建特定的日期和时间

你可以通过传入年、月、日、时、分、秒等参数来创建一个特定的 datetime 对象。

from datetime import datetime
# 创建一个特定的日期和时间
# 年, 月, 日, 时, 分, 秒, 微秒 (微秒是可选的)
specific_dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"特定的日期和时间: {specific_dt}")
# 输出: 特定的日期和时间: 2025-10-27 10:30:00

格式化日期和时间 (字符串 ↔ datetime)

我们需要将 datetime 对象转换成易读的字符串,或者将字符串转换成 datetime 对象进行计算。

1 datetime 对象 → 字符串

使用 strftime() (string format time) 方法。

Python datetime 如何计算时间差?-图2
(图片来源网络,侵删)
格式代码 含义 示例
%Y 四位数的年份 2025
%m 两位数的月份 (01-12) 10
%d 两位数的日 (01-31) 27
%H 24小时制的小时 (00-23) 15
%I 12小时制的小时 (01-12) 03
%M 分钟 (00-59) 30
%S 秒 (00-59) 45
%f 微秒 (000000-999999) 123456
%A 星期名称 Friday
%B 月份名称 October
%p AM 或 PM PM
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 30, 45)
# 格式化为 "YYYY-MM-DD HH:MM:SS"
formatted_str1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化1: {formatted_str1}") # 输出: 格式化1: 2025-10-27 15:30:45
# 格式化为 "YYYY年MM月DD日 HH时MM分"
formatted_str2 = dt.strftime("%Y年%m月%d日 %H时%M分")
print(f"格式化2: {formatted_str2}") # 输出: 格式化2: 2025年10月27日 15时30分
# 格式化为易读的完整日期时间
formatted_str3 = dt.strftime("%A, %B %d, %Y at %I:%M %p")
print(f"格式化3: {formatted_str3}") # 输出: 格式化3: Friday, October 27, 2025 at 03:30 PM

2 字符串 → datetime 对象

使用 strptime() (string parse time) 函数,你需要提供字符串和它对应的格式。

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

日期和时间的计算 (加减运算)

datetime 对象可以与 timedelta 对象进行加减运算。

1 timedelta 对象

timedelta 表示一个时间差,可以指定天、秒、微秒、毫秒、分钟、小时、周。

from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差对象
# 3天
three_days = timedelta(days=3)
# 10小时
ten_hours = timedelta(hours=10)
# 2周
two_weeks = timedelta(weeks=2)
# 计算未来和过去的日期
future_date = now + three_days
past_date = now - ten_hours
print(f"当前时间: {now}")
print(f"3天后的时间: {future_date}")
print(f"10小时前的时间: {past_date}")
# 输出示例:
# 当前时间: 2025-10-27 15:45:00.123456
# 3天后的时间: 2025-10-30 15:45:00.123456
# 10小时前的时间: 2025-10-27 05:45:00.123456

2 计算两个日期之间的差值

两个 datetime 对象相减,会得到一个 timedelta 对象。

from datetime import datetime
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 10, 27)
# 计算时间差
time_difference = date2 - date1
print(f"时间差: {time_difference}")
print(f"时间差的类型: {type(time_difference)}")
print(f"相隔的天数: {time_difference.days}")
# 输出:
# 时间差: 301 days, 0:00:00
# 时间差的类型: <class 'datetime.timedelta'>
# 相隔的天数: 301

比较日期和时间

可以直接使用比较运算符 (>, <, , , >=, <=) 来比较 datetime 对象。

from datetime import datetime
dt1 = datetime(2025, 1, 1)
dt2 = datetime(2025, 12, 31)
dt3 = datetime(2025, 1, 1)
print(f"dt1 < dt2 ? {dt1 < dt2}")  # True
print(f"dt1 > dt2 ? {dt1 > dt2}")  # False
print(f"dt1 == dt3 ? {dt1 == dt3}") # True

实用技巧与常见问题

技巧 1:获取某月的第一天和最后一天

import calendar
from datetime import datetime, timedelta
def get_month_range(year, month):
    # 获取该月的第一天
    first_day = datetime(year, month, 1)
    # 获取下一个月的第一天,然后减去一天,得到当前月的最后一天
    if month == 12:
        next_month_first_day = datetime(year + 1, 1, 1)
    else:
        next_month_first_day = datetime(year, month + 1, 1)
    last_day = next_month_first_day - timedelta(days=1)
    return first_day, last_day
# 获取 2025 年 10 月的第一天和最后一天
first, last = get_month_range(2025, 10)
print(f"2025年10月第一天: {first.strftime('%Y-%m-%d')}")
print(f"2025年10月最后一天: {last.strftime('%Y-%m-%d')}")
# 输出:
# 2025年10月第一天: 2025-10-01
# 2025年10月最后一天: 2025-10-31

技巧 2:处理时区

datetime 模块本身不包含时区信息,但可以使用 pytz 库(Python 的时区库)来处理。

首先需要安装:pip install pytz

from datetime import datetime
import pytz
# 获取带时区的当前时间
# 纽约时区
ny_tz = pytz.timezone('America/New_York')
now_in_ny = datetime.now(ny_tz)
# 上海时区
sh_tz = pytz.timezone('Asia/Shanghai')
now_in_sh = datetime.now(sh_tz)
print(f"纽约当前时间: {now_in_ny}")
print(f"上海当前时间: {now_in_sh}")
# 将一个无时区的时间对象本地化为指定时区
# 注意:naive datetime (无时区) 不能直接和 aware datetime (有时区) 运算
utc_time = datetime.utcnow()
utc_time = pytz.utc.localize(utc_time) # 将 UTC 时间标记为 UTC 时区
sh_time_from_utc = utc_time.astimezone(sh_tz) # 转换为上海时间
print(f"UTC时间: {utc_time}")
print(f"从UTC转换来的上海时间: {sh_time_from_utc}")

操作 方法/函数 示例
获取当前时间 datetime.now() now = datetime.now()
创建特定时间 datetime(...) dt = datetime(2025, 10, 27)
转成字符串 dt.strftime(format) dt.strftime("%Y-%m-%d")
从字符串解析 datetime.strptime(str, format) dt = datetime.strptime("2025-10-27", "%Y-%m-%d")
时间加减 timedelta future = now + timedelta(days=7)
计算时间差 dt1 - dt2 delta = dt2 - dt1
比较时间 >, <, if dt1 < dt2:
处理时区 pytz ny_tz = pytz.timezone('...')

掌握 datetime 模块是进行任何与时间相关编程的基础,多加练习 strftimestrptime,因为这是在代码和用户界面之间转换时间格式的关键。

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