目 录CONTENT

文章目录

Python-深入了解 Python 的 datetime 模块

~梓
2025-03-03 / 0 评论 / 0 点赞 / 34 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

深入了解 Python 的 datetime 模块

在 Python 中,datetime 模块是处理日期和时间的核心库。无论是记录时间戳、计算时间差,还是格式化时间输出,datetime 模块都提供了强大的支持。本文将从 datetime 的基础概念到进阶应用进行详细讲解,并提供实用的示例代码。


1. datetime 模块简介

datetime 模块用于处理 日期(year, month, day)和时间(hour, minute, second, microsecond),它不仅支持时间格式化,还可以进行时间的加减运算、时间比较等操作。

datetime 模块中,常用的类包括:

  • datetime:表示日期 + 时间
  • date:仅表示日期
  • time:仅表示时间
  • timedelta:用于时间计算
  • timezone:处理时区

2. datetime.datetime:日期时间对象

2.1 获取当前日期时间

from datetime import datetime

now = datetime.now()  # 获取当前时间
print(now)  # 输出示例:2025-03-03 15:30:45.123456

datetime.now() 返回的是 当前系统时间,精确到微秒。


2.2 指定日期和时间

dt = datetime(2024, 9, 7, 18, 24, 33)  # 指定时间
print(dt)  # 输出:2024-09-07 18:24:33

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)
可以 指定年、月、日,以及 时、分、秒、微秒(可选)。


2.3 datetime 转换为字符串(格式化时间)

使用 .strftime() 方法,可以将 datetime 对象转换成字符串:

formatted_time = dt.strftime('%Y-%m-%d %H:%M:%S')
print(formatted_time)  # 输出:2024-09-07 18:24:33

常见时间格式符号:

格式符 含义 示例
%Y 年(四位数) 2024
%m 月(两位数) 09
%d 日(两位数) 07
%H 小时(24 小时制) 18
%I 小时(12 小时制) 06
%M 分钟 24
%S 33
%f 微秒 000123
%A 星期(英文) Saturday

2.4 字符串转换为 datetime

dt_str = '2024-09-07 18:24:33'
dt_obj = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
print(dt_obj)  # 输出:2024-09-07 18:24:33

strptime() 用于将 时间字符串 转换为 datetime 对象,格式必须匹配!


3. timedelta:时间差计算

timedelta 用于时间加减,比如计算 某天之后/之前的时间

3.1 计算 7 天后的时间

from datetime import timedelta

future_date = now + timedelta(days=7)
print(future_date)  # 当前时间 + 7 天

3.2 计算时间差

dt1 = datetime(2024, 9, 7, 18, 24, 33)
dt2 = datetime(2024, 9, 1, 12, 0, 0)
delta = dt1 - dt2  # 计算时间差
print(delta)  # 6 days, 6:24:33
print(delta.total_seconds())  # 558273.0(秒)

.total_seconds() 可以获取两个时间之间的秒数。


4. datetime

4.1 date 只处理日期

from datetime import date

today = date.today()  # 获取当前日期
print(today)  # 输出:2025-03-03
print(today.year, today.month, today.day)  # 分别获取年、月、日

如果只需要处理 日期,可以使用 date,它比 datetime 更简单。


4.2 time 只处理时间

from datetime import time

t = time(14, 30, 15)  # 14:30:15
print(t.hour, t.minute, t.second)  # 输出:14 30 15

如果只需要处理 时间(时分秒),可以使用 time


5. timestamp:时间戳转换

5.1 datetime 转 时间戳

timestamp = dt.timestamp()
print(timestamp)  # 输出:1725702273.0(单位:秒)

时间戳 是从 1970-01-01 00:00:00 以来的秒数。


5.2 时间戳 转 datetime

不考虑时区

from datetime import datetime

def timestamp_to_hms(timestamp):
    # 使用 utcfromtimestamp 方法将时间戳转换为 UTC 时间的 datetime 对象
    dt = datetime.utcfromtimestamp(timestamp)
    # 格式化 datetime 对象,获取时分秒
    return dt.strftime("%H:%M:%S")

# 示例时间戳(单位:秒)
timestamp = 3725
print(timestamp_to_hms(timestamp))

6. 处理时区(timezone 类)

Python datetime 默认是 无时区的(Naive Datetime),如果要处理不同时区,需要用 pytztimezone 进行转换。

from datetime import timezone, timedelta

# 创建 UTC+8 时区
tz_utc_8 = timezone(timedelta(hours=8))

# 获取当前时间,并转换到 UTC+8
now = datetime.now().replace(tzinfo=timezone.utc)  # 先设定为 UTC
now_utc8 = now.astimezone(tz_utc_8)  # 转换到 UTC+8
print(now_utc8)  # 2025-03-03 23:30:45+08:00

注意:Python 内置 datetime 只能支持固定的 UTC 偏移时区,更复杂的时区(如夏令时)需要 pytz 处理。


7. datetime 实战应用

7.1 计算某天是星期几

dt = datetime(2024, 9, 7)
print(dt.strftime('%A'))  # Saturday

7.2 计算两日期之间的天数

d1 = date(2025, 3, 3)
d2 = date(2024, 9, 7)
delta = d1 - d2
print(delta.days)  # 178 天

7.3 判断是否是闰年

def is_leap_year(year):
    return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)

print(is_leap_year(2024))  # True
print(is_leap_year(2025))  # False

总结

  • datetime 处理 日期 + 时间
  • date 处理 日期(年月日)
  • time 处理 时间(时分秒)
  • timedelta 处理 时间计算
  • timestamp 处理 时间戳
  • timezone 处理 时区

扩展:8. 判断闰年

闰年判断规则

闰年需满足下面两个条件之一:

  1. 该年份能被 4 整除,不过不能被 100 整除。
  2. 该年份能被 400 整除。

方法一:使用 calendar.isleap() 函数

import calendar

year = 2024
is_leap = calendar.isleap(year)
print(f"{year} 年是否为闰年: {is_leap}")

9. strftime

日期相关

格式代码 描述 示例
%a 星期几的简写 Mon
%A 星期几的全称 Monday
%w 星期几的数字表示(0 表示星期日,6 表示星期六) 1
%d 月份中的第几天,以 0 填充的两位数 01
%-d 月份中的第几天,无填充 1 (在支持此语法的系统中,如 Linux)
%b 月份的简写 Jan
%B 月份的全称 January
%m 月份,以 0 填充的两位数 01
%-m 月份,无填充 1 (在支持此语法的系统中,如 Linux)
%y 年份的后两位数字 23
%Y 完整的四位数年份 2023
%j 一年中的第几天,以 0 填充的三位数 001
%-j 一年中的第几天,无填充 1 (在支持此语法的系统中,如 Linux)
%U 一年中的第几周(星期日作为一周的开始),以 0 填充的两位数 00
%W 一年中的第几周(星期一作为一周的开始),以 0 填充的两位数 00

时间相关

格式代码 描述 示例
%H 小时(24 小时制),以 0 填充的两位数 00
%-H 小时(24 小时制),无填充 0 (在支持此语法的系统中,如 Linux)
%I 小时(12 小时制),以 0 填充的两位数 12
%-I 小时(12 小时制),无填充 12 (在支持此语法的系统中,如 Linux)
%p 上午或下午(AM 或 PM) AM
%M 分钟,以 0 填充的两位数 00
%-M 分钟,无填充 0 (在支持此语法的系统中,如 Linux)
%S 秒,以 0 填充的两位数 00
%-S 秒,无填充 0 (在支持此语法的系统中,如 Linux)
%f 微秒,以 0 填充的六位数 000000

时区相关

格式代码 描述 示例
%z 时区偏移量,格式为 ±HHMM +0800
%Z 时区名称 CST

其他

格式代码 描述 示例
%c 本地日期和时间的表示 Mon Jan 1 00:00:00 2023
%x 本地日期的表示 01/01/23
%X 本地时间的表示 00:00:00
%% 百分号字符 %
from datetime import datetime

now = datetime.now()

# 示例格式
formatted_date1 = now.strftime("%Y-%m-%d %H:%M:%S")
formatted_date2 = now.strftime("%A, %B %d, %Y")
formatted_date3 = now.strftime("%I:%M %p")

print(formatted_date1)
print(formatted_date2)
print(formatted_date3)


# 2025-04-09 13:55:53
# Wednesday, April 09, 2025
# 01:55 PM

10. strftimestrptime的区别

strptimestrftime 通常是在处理日期和时间相关操作时会用到的两个方法,它们主要用于字符串和日期时间对象之间的转换,不过具体作用是相反的。下面以 Python 为例,详细介绍它们的区别。

功能用途

  • strptime:是 “string parse time” 的缩写,其作用是将字符串解析为日期时间对象。当你从文件、用户输入或其他数据源获取到日期时间的字符串表示,想把它转换为程序中可操作的日期时间对象时,就会用到 strptime
  • strftime:是 “string format time” 的缩写,用于将日期时间对象格式化为字符串。当你需要将程序中的日期时间对象按照特定的格式输出,比如显示在网页上、保存到文件中时,就会使用 strftime

语法格式

  • strptimedatetime.strptime(date_string, format),其中 date_string 是要解析的日期时间字符串,format 是该字符串的格式代码。
  • strftimedatetime_object.strftime(format),这里的 datetime_object 是一个日期时间对象,format 同样是指定输出字符串的格式代码。
from datetime import datetime

# 使用 strptime 将字符串解析为日期时间对象
date_string = "2024-10-15"
date_object = datetime.strptime(date_string, "%Y-%m-%d")
print(f"解析后的日期对象: {date_object}")

# 使用 strftime 将日期时间对象格式化为字符串
formatted_string = date_object.strftime("%d/%m/%Y")
print(f"格式化后的日期字符串: {formatted_string}")

输出

解析后的日期对象: 2024-10-15 00:00:00
格式化后的日期字符串: 15/10/2024
0

评论区