Python日期与时间处理完整指南

许南星
许南星
发布时间:2026-10-11| 6人浏览过
原创

面对业务中复杂的时间排序、日志记录或周期推算需求,Python提供了丰富的内置库与第三方工具。本文系统整理30种常用日期处理方法,覆盖从基础获取到高级时区转换、日历运算的完整链路,附带标准化代码示例与运行参数,方便直接集成至实际项目中。

基础时间与日期获取

第1步:获取并格式化当前本地时间

目的:展示程序运行时的标准时间字符串。
入口:time 模块
动作:调用 localtime() 获取时间元组,配合 strftime() 定义输出格式。传入时间戳可转换GMT时间。
重要参数:格式符如 %Y-%m-%d %H:%M:%S、%a、%B。
完成状态:终端输出符合预设排版规则的当前时间字符串。

import time
from time import gmtime, strftime

t = time.localtime()  
print(time.asctime(t))  
print(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()))  
print(strftime("%A", gmtime()))  
print(strftime("%D", gmtime()))  
print(strftime("%B", gmtime()))  
print(strftime("%y", gmtime()))  

# Convert seconds into GMT date
print(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime(1234567890)))

第2步:获取毫秒级时间戳

目的:适用于需要高精度计时的接口对接或缓存键生成。
入口:time.time()
动作:获取当前秒级浮点时间戳,乘以1000后取整。
参数:无额外参数。
完成状态:输出13位整型数值,可直接用于前端显示或时序数据库写入。

import time

milliseconds = int(round(time.time() * 1000))
print(milliseconds)

第3步:整数时间戳转为日期对象

目的:将外部API返回或数据库存储的Unix时间戳还原为可读日期。
入口:datetime.fromtimestamp()
动作:传入整型时间戳生成带时分秒的 datetime 对象。
参数:目标时间戳(秒或毫秒需提前调整)。
完成状态:返回标准的 datetime.datetime 实例。

from datetime import datetime

i = 1545730073
timestamp = datetime.fromtimestamp(i)

print(timestamp)  
print(type(timestamp))

第4步:提取年份等独立字段

目的:从日期对象中单独获取年、月、日维度数据用于报表统计。
入口:datetime.date.today().year
动作:访问 datetime 对象的属性直接读取对应值。
完成状态:终端输出对应数值类型(int)。

import datetime
 
year = datetime.date.today().year
print(year)

字符串与日期对象互转

第5步:按指定格式解析字符串

目的:将固定排版的时间文本转换为可计算的日期结构。
入口:datetime.strptime()
动作:输入原始字符串与严格的格式掩码,执行解析。
参数:格式串需与输入严格匹配,如 %b %d %Y %I:%M%p。
完成状态:返回 class 'datetime.datetime' 对象。

from datetime import datetime
from dateutil import parser

d1 = "Jan 7 2015  1:15PM"

# If you know date format
date1 = datetime.strptime(d1, '%b %d %Y %I:%M%p')
print(type(date1))  
print(date1)  

第6步:智能识别未知格式的日期

目的:处理用户录入或非标准来源的杂乱时间文本。
入口:dateutil.parser.parse()
动作:传入任意自然语言格式的日期字符串,引擎自动推断结构。
完成状态:输出校正后的标准 datetime 对象。

d2 = "2015 Jan 7  1:33PM"

# If you don't know date format
date2 = parser.parse(d2)
print(type(date2))  
print(date2)  

时区转换与全球时间

第7步:配置并输出多时区当前时间

目的:支持跨国业务或多服务器节点的统一时间展示。
入口:pytz.timezone()
动作:初始化目标时区对象,调用 datetime.now(tz) 获取带偏移量的时间。
参数:IANA时区名称,如 'MST'、'EST'、'UTC'、'GMT'、'HST'。
完成状态:输出包含地区标识与UTC偏移量的时间串。

from datetime import datetime
from pytz import timezone
 
mst = timezone('MST')
print("Time in MST:", datetime.now(mst))  
est = timezone('EST')
print("Time in EST:", datetime.now(est))  
utc = timezone('UTC')
print("Time in UTC:", datetime.now(utc))  
gmt = timezone('GMT')
print("Time in GMT:", datetime.now(gmt))  
hst = timezone('HST')
print("Time in HST:", datetime.now(hst))  

第8步:跨时区时间换算

目的:将某一城市时间无缝切换至另一城市时间,保持绝对时刻不变。
入口:pendulum 库 动作:构建源时区时间对象,调用 in_timezone() 转换目标时区。
参数:目标时区字符串(如 'America/New_York')。 完成状态:输出转换后对应的当地时间及新时区偏移。

import pendulum
 
in_paris = pendulum.datetime(2016, 8, 7, 22, 24, 30, tz='Europe/Paris')
print(in_paris)  
 
in_us = in_paris.in_timezone('America/New_York')
print(in_us)  

第9步:打印所有可用系统时区列表

目的:排查环境支持的时区范围或生成下拉菜单选项。
入口:pytz.all_timezones
动作:遍历迭代器逐行输出时区名称。
完成状态:控制台列出完整的时区字符串数组。

import pytz

for i in pytz.all_timezones:
    print(i)

日期计算与差值处理

第10步:天/小时/分钟转换为总秒数

目的:将分散的时间单位合并为单一基准单位,便于存储或比较。
入口:自定义常量映射表
动作:逐项累加各维度乘积。
参数:SECONDS_PER_DAY=86400 等常量定义。
完成状态:输出合计秒数整型值。

SECONDS_PER_MINUTE = 60
SECONDS_PER_HOUR = 3600
SECONDS_PER_DAY = 86400
 
# 输入天、小时、分钟、秒的数量
days = int(input("Enter number of Days: "))
hours = int(input("Enter number of Hours: "))
minutes = int(input("Enter number of Minutes: "))
seconds = int(input("Enter number of Seconds: "))
 
# 计算
total_seconds = days * SECONDS_PER_DAY
total_seconds = total_seconds + ( hours * SECONDS_PER_HOUR)
total_seconds = total_seconds + ( minutes * SECONDS_PER_MINUTE)
total_seconds = total_seconds + seconds
 
# 结果
print("Total number of seconds: ","%d"%(total_seconds))

第11步:计算两个日期的差值(含天数与微秒)

目的:获取两个时间点之间的精确跨度,适用于计费周期或日志审计。
入口:datetime.strptime() 与 - 运算符
动作:先解析字符串,再相减得到 timedelta 对象。
参数:统一格式掩码 %Y-%m-%d %H:%M:%S.%f。
完成状态:可通过 .days、.seconds、.microseconds 分别提取对应维度差值。

import datetime
from datetime import timedelta
 
datetimeFormat = '%Y-%m-%d %H:%M:%S.%f'
date1 = '2016-04-16 10:01:28.585'
date2 = '2016-03-10 09:56:28.067'
diff = datetime.datetime.strptime(date1, datetimeFormat)\
    - datetime.datetime.strptime(date2, datetimeFormat)
 
print("Difference:", diff)  
print("Days:", diff.days)  
print("Microseconds:", diff.microseconds)  
print("Seconds:", diff.seconds)  

第12步:将日期差值统一换算为秒

目的:将 timedelta 结果标准化为纯秒数,适配多数API响应要求。
入口:difference.total_seconds()
动作:对 timedelta 实例调用聚合方法。
完成状态:返回浮点型总秒数。

import datetime
 
time1 = datetime.datetime.strptime('19 01 2021', '%d %m %Y')
time2 = datetime.datetime.strptime('25 01 2021', '%d %m %Y')
 
difference = time2 - time1
print(difference)  
 
seconds = difference.total_seconds()
print(seconds)  

第13步:基于当前时间加减偏移量

目的:实现相对时间推算,如倒计时、历史回溯或未来预警。
入口:datetime.timedelta()
动作:在基准时间上叠加正负 days、hours、minutes。
参数:偏移量单位与数值。
完成状态:输出计算后的新时间对象。

# Unix时间戳加5分钟
import datetime
import calendar 

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
print(calendar.timegm(future.timetuple()))  

# 当前日期减去N天
d = datetime.today() - timedelta(days=5)
print(d)

# 获取7天前的连续日期
now = datetime.now()
for x in range(7):
    d = now - timedelta(days=x)
    print(d.strftime("%Y-%m-%d"))

# 创建15分钟前的DateTime
dt = datetime.datetime.now() - datetime.timedelta(minutes=15)
print(dt)

# 获取昨天的MMDDYY格式
from datetime import date, timedelta
yesterday = date.today() - timedelta(days=1)
print(yesterday.strftime('%m%d%y'))

第14步:比较两个日期对象的大小关系

目的:校验时间先后顺序,常用于权限验证或数据有效性拦截。
入口:datetime.datetime()
动作:直接使用 <、> 运算符比对实例。
完成状态:返回布尔值 True 或 False。

import datetime

a = datetime.datetime(2020, 12, 31, 23, 59, 59)
b = datetime.datetime(2020, 11, 30, 23, 59, 59)

print(a < b)
print(a > b)

日历查询与特定日期定位

第15步:查询指定日期是星期几

目的:获取日历维度的周序信息,用于排班或日程提醒。
入口:datetime.date.strftime()、.weekday()、.isoweekday()
动作:格式化输出中文/英文星期名;.weekday() 返回0-6(周一起算),.isoweekday() 返回1-7(周一起算)。
完成状态:输出对应数字索引或名称字符串。

import datetime
 
dayofweek = datetime.date(2010, 6, 16).strftime("%A")
print(dayofweek)  

# weekday(): 0代表周一,6代表周日
print("weekday():", datetime.date(2010, 6, 16).weekday())  

# isoweekday(): 1代表周一,7代表周日
print("isoweekday()", datetime.date(2010, 6, 16).isoweekday())  

dayofweek = datetime.datetime.today().strftime("%A")
print(dayofweek)  
print("weekday():", datetime.datetime.today().weekday())  
print("isoweekday()", datetime.datetime.today().isoweekday())  

第16步:推算过去或未来的工作日与特定星期

目的:过滤周末,精准定位最近的工作日或指定周次的星期X。
入口:datetime.weekday() < 5 判断、calendar.SUNDAY 枚举
动作:循环递减日期并跳过非工作日;或通过 (today.weekday() - target) % 7 计算偏移量。
参数:目标星期的索引值(如周二为2)。
完成状态:输出符合筛选条件的最新日期。

# 获得最后7个工作日
from datetime import date, timedelta
today = date.today()
for i in range(7):
    d = today - timedelta(days=i)
    if d.weekday() < 5:
        print(d)

# 获取上周三的日期
today = date.today()
offset = (today.weekday() - 2) % 7
wednesday = today - timedelta(days=offset)
print(wednesday)

第17步:查询某年某月的第1个或第N个星期X

目的:满足财务结算、发薪日或月度会议排期需求。
入口:calendar.monthdatescalendar()
动作:生成完整日历矩阵,扁平化后过滤目标月份与星期索引,取第N项。
参数:目标月份、星期常量(如 calendar.TUESDAY)、序号N。
完成状态:返回 datetime.date 对象,捕获 IndexError 防越界。

# 获得本月的第一个星期二
import calendar
from datetime import datetime
c = calendar.Calendar(firstweekday=calendar.SUNDAY)
monthcal = c.monthdatescalendar(datetime.today().year, datetime.today().month)
try:
    tues = [day for week in monthcal for day in week if
            day.weekday() == calendar.TUESDAY and day.month == datetime.today().month][0]
    print(tues)
except IndexError:
    print('No date found')

# 获得任何一个月的第N个星期五
# 取2021年5月的第三个星期五
c = calendar.Calendar(firstweekday=calendar.SUNDAY)
year = 2021
month = 5
n = 2  # 取第三个
monthcal = c.monthdatescalendar(year, month)
 
try:
    third_friday = [
        day for week in monthcal 
            for day in week if
                day.weekday() == calendar.FRIDAY and day.month == month
    ][n]
    print(third_friday)  
except IndexError:
    print('No date found')

第18步:按年月生成连续日期序列

目的:填充图表X轴、生成测试用例基线或补全时间缺失段。
入口:datetime.strptime() 配合列表推导式
动作:计算首尾日期间隔天数,逐个追加偏移量生成队列。
参数:起始与结束日期字符串及其格式掩码 %d-%m-%Y。
完成状态:输出包含每日日期的列表。

import datetime

start = datetime.datetime.strptime("21-06-2020", "%d-%m-%Y")
end = datetime.datetime.strptime("05-07-2020", "%d-%m-%Y")
date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end - start).days)]

for date in date_generated:
    print(date.strftime("%d-%m-%Y"))

第19步:根据ISO周数计算对应日期

目的:处理采用周次编号的业务系统数据映射。
入口:dateutil.relativedelta
动作:从年初开始叠加指定周数。
参数:年份 year 与周数 weeks。
完成状态:输出对应ISO周的实际日期。

import datetime
from dateutil.relativedelta import relativedelta
 
week = 25
year = 2021
date = datetime.date(year, 1, 1) + relativedelta(weeks=+week)
print(date)  

第20步:获取特定日期的工作日序号

目的:区分该日期处于一年中的第几周及第几天。
入口:datetime.date.isocalendar()[2]
动作:调用 isocalendar() 获取 (ISO年, ISO周, ISO工作日) 三元组,取第三项。
完成状态:返回1-7的整数。

import datetime
 
print(datetime.date(2020, 5, 15).isocalendar()[2])  

第21步:使用Pendulum精确控制周的起止时间

目的:快速截取自然周的时间窗口,避免手动计算边界。
入口:pendulum.start_of('week') / end_of('week')
动作:绑定具体日期后调用时间切分方法。 参数:对齐维度 'week'、'month'、'year' 等。完成状态:输出该周期起点零点与终点末秒的标准时间串。

import pendulum
 
dt = pendulum.datetime(2012, 9, 5)
 
start = dt.start_of('week')
print(start.to_datetime_string())  
 
end = dt.end_of('week')
print(end.to_datetime_string())  

Pandas与扩展应用

第22步:使用Pandas快速获取结构化时间信息

目的:在数据管道中提取年、月、日、时、分、秒、微秒等独立列。
入口:pandas 库 动作:调用 Timestamp.now() 生成时间戳,直接点选属性获取分量。 注意:原教程中的 pd.datetime.now() 在新版Pandas中已标记为弃用,建议替换为 pd.Timestamp.now()。
完成状态:终端依次打印对应字段数值。

import pandas as pd
current_ts = pd.Timestamp.now()
print(current_ts)
print(current_ts.date())  
print(current_ts.year)  
print(current_ts.month)  
print(current_ts.day)  
print(current_ts.hour)  
print(current_ts.minute)  
print(current_ts.second)  
print(current_ts.microsecond)

第23步:通过生日对象自动计算实际年龄

目的:处理用户注册表单中的法定年龄校验,兼容闰年2月29日异常。
入口:datetime.date.replace() 与条件分支
动作:尝试将生日年份替换为当年;若因闰月导致ValueError则顺延至3月1日。对比是否已过生日确定周岁。
完成状态:返回准确的实岁整数。

from datetime import date
 
def calculate_age(born):
    today = date.today()
    try:
        birthday = born.replace(year=today.year)
    except ValueError:
        birthday = born.replace(year=today.year, month=born.month + 1, day=1)
    if birthday > today:
        return today.year - born.year - 1
    else:
        return today.year - born.year
 
print(calculate_age(date(2001, 3, 1)))

简要总结

以上就是Python处理日期方法的详细内容,更多关于Python日期时间处理与格式化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。