4.6 Python3 日期和时间

Python 提供了强大的日期和时间处理功能,主要通过 datetime 模块实现。以下是全面的日期和时间处理指南。


目录

1. 核心模块

1.1 date 类

1.2 time 类

1.3 datetime 类

1.4 timedelta 类

2. 获取当前时间

2.1 获取当前日期和时间

2.2 获取时间戳

3. 创建特定日期/时间

4. 时间格式转换

4.1 常用格式代码

4.2 datetime转字符串

4.3 字符串转datetime

5. 时间计算

5.1 使用timedelta

5.2 日期差计算

6. 时间组件访问

7. 时区处理

7.1 基本时区操作

7.2 时区转换

8. 实用函数

8.1 月份天数

8.2 闰年判断

9. 性能计时

10. 其他有用功能

10.1 获取周的开始和结束

10.2 日期迭代器

总结

最佳实践建议


1. 核心模块

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

各模块核心功能对比

模块/类主要用途示例
datetime.date处理日期(年、月、日)date(2023, 8, 20)
datetime.time处理时间(时、分、秒、微秒)time(15, 30, 45)
datetime.datetime处理日期和时间datetime.now()
datetime.timedelta处理时间间隔timedelta(days=1)
time_module系统时间相关功能time_module.sleep(1)
calendar日历相关操作calendar.month(2023, 8)

1.1 date 类

from datetime import date

# 创建日期对象
today = date.today()  # 当前日期
specific_date = date(2023, 5, 15)  # 指定日期

print(today)  # 输出: 2023-05-15 (示例)
print(specific_date.year)  # 2023
print(specific_date.month)  # 5
print(specific_date.day)  # 15

# 日期运算
delta = today - specific_date  # 时间差
print(delta.days)  # 相差天数

1.2 time 类

from datetime import time

# 创建时间对象
t = time(14, 30, 15)  # 14:30:15

print(t.hour)  # 14
print(t.minute)  # 30
print(t.second)  # 15
print(t.microsecond)  # 0 (默认)

1.3 datetime 类

from datetime import datetime

# 当前日期和时间
now = datetime.now()
print(now)  # 2023-05-15 14:32:45.123456 (示例)

# 指定日期和时间
dt = datetime(2023, 5, 15, 14, 30, 0)
print(dt)  # 2023-05-15 14:30:00

# 获取date和time部分
print(dt.date())  # 2023-05-15
print(dt.time())  # 14:30:00

# 时间戳转换
timestamp = dt.timestamp()  # 转换为时间戳
print(datetime.fromtimestamp(timestamp))  # 从时间戳转换回来

1.4 timedelta 类

from datetime import datetime, timedelta

now = datetime.now()

# 加减时间
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)

# 复杂的时间差
delta = timedelta(
    days=5,
    hours=3,
    minutes=30,
    seconds=15
)
future = now + delta
print(future)

2. 获取当前时间

2.1 获取当前日期和时间

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

now = datetime.now()  # 返回datetime对象
print(now)  # 例如: 2025-08-20 15:30:45.123456

today = date.today()  # 只获取日期
print(today)  # 例如: 2025-08-20

2.2 获取时间戳

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

timestamp = time_module.time()  # 当前时间戳(秒)
print(timestamp)  # 例如: 1692531045.123456

# 时间戳转datetime
dt = datetime.fromtimestamp(timestamp)
print(dt)  # 2023-08-20 15:30:45.123456


3. 创建特定日期/时间

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

# 创建日期
d = date(2023, 8, 20)
print(d)  # 2023-08-20

# 创建时间
t = time(15, 30, 45)
print(t)  # 15:30:45

# 创建datetime
dt = datetime(2023, 8, 20, 15, 30, 45)
print(dt)  # 2023-08-20 15:30:45


4. 时间格式转换

4.1 常用格式代码

代码含义示例
%Y四位数的年份2023
%m两位数的月份(01-12)05
%d两位数的日(01-31)15
%H24小时制的小时(00-23)14
%I12小时制的小时(01-12)02
%M分钟(00-59)30
%S秒(00-59)45
%A完整的星期名称Monday
%B完整的月份名称May
%pAM/PMPM

4.2 datetime转字符串

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)  # "2023-08-20 15:30:45"

# 常用格式
print(now.strftime("%A, %B %d, %Y"))  # "Sunday, August 20, 2023"
print(now.strftime("%I:%M %p"))  # "03:30 PM"

4.3 字符串转datetime

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

date_str = "2023-08-20 15:30:45"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(dt)  # 2023-08-20 15:30:45

5. 时间计算

5.1 使用timedelta

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

# 基本加减
now = datetime.now()
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)

# 复杂计算
future = now + timedelta(
    days=5,
    hours=3,
    minutes=30,
    seconds=15
)

print(future)

5.2 日期差计算

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

date1 = date(2023, 8, 1)
date2 = date(2023, 8, 20)
delta = date2 - date1
print(delta.days)  # 19

6. 时间组件访问

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

dt = datetime.now()

print(dt.year)        # 2023
print(dt.month)       # 8
print(dt.day)         # 20
print(dt.hour)        # 15
print(dt.minute)      # 30
print(dt.second)      # 45
print(dt.microsecond) # 123456
print(dt.weekday())   # 0-6 (0是周一)
print(dt.isoweekday()) # 1-7 (1是周一)

7. 时区处理

7.1 基本时区操作

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

from datetime import timezone

# UTC时间
utc_now = datetime.now(timezone.utc)
print(utc_now)  # 2023-08-20 07:30:45.123456+00:00

# 自定义时区
beijing_tz = timezone(timedelta(hours=8))
beijing_time = datetime.now(beijing_tz)
print(beijing_time)  # 2023-08-20 15:30:45.123456+08:00

7.2 时区转换

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

from datetime import timezone

# UTC时间
utc_now = datetime.now(timezone.utc)
print(utc_now)  # 2023-08-20 07:30:45.123456+00:00


# 从UTC转换到其他时区
ny_tz = timezone(timedelta(hours=-5))
ny_time = utc_now.astimezone(ny_tz)
print(ny_time)  # 2023-08-20 02:30:45.123456-05:00

8. 实用函数

8.1 月份天数

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

# 获取某个月的天数
print(calendar.monthrange(2025, 8)[1])  # 31

# 或者使用date
def days_in_month(year, month):
    if month == 12:
        return (date(year+1, 1, 1) - date(year, 12, 1)).days
    else:
        return (date(year, month+1, 1) - date(year, month, 1)).days

print(days_in_month(2025, 8))  # 31

8.2 闰年判断

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

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

print(is_leap(2025))  # False

9. 性能计时

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

# 简单计时
start = time_module.perf_counter()
# 执行代码...
end = time_module.perf_counter()
print(f"耗时: {end - start:.4f}秒")

# 更精确的计时
start = time_module.perf_counter_ns()
# 执行代码...
end = time_module.perf_counter_ns()
print(f"耗时: {(end - start)/1e6:.4f}毫秒")

10. 其他有用功能

10.1 获取周的开始和结束

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

def week_range(date):
    start = date - timedelta(days=date.weekday())
    end = start + timedelta(days=6)
    return start, end

start, end = week_range(date.today())
print(f"本周从 {start} 到 {end}")

10.2 日期迭代器

import datetime  # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module  # 时间相关函数
import calendar  # 日历相关

def date_range(start_date, end_date):
    for n in range(int((end_date - start_date).days) + 1):
        yield start_date + timedelta(n)

for single_date in date_range(date(2025, 8, 1), date(2025, 8, 10)):
    print(single_date.strftime("%Y-%m-%d"))

总结

Python 的日期时间处理功能非常全面,可以满足各种需求:

  • 基本日期时间创建和访问

  • 灵活的时间格式转换

  • 精确的时间计算

  • 时区处理

  • 高性能计时

最佳实践建议

  1. 时区处理原则

    • 所有时间在存储和传输时使用UTC

    • 只在显示给用户时转换为本地时区

  2. 性能敏感场景

    • 使用time_module.perf_counter()而不是time.time()

    • 对于大量日期计算,考虑使用第三方库pendulum

  3. 代码可读性

    • 为业务相关的日期操作创建工具函数

    • 使用具名常量代替魔术数字(如SECONDS_PER_DAY = 86400

  4. 错误处理

    • 总是验证用户输入的日期

    • 处理闰年和非法日期(如2月30日)

对于更复杂的时区处理,建议使用 Python 3.9+ 的 zoneinfo 模块或第三方库 pytz


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值