Python日期与时间处理完整指南
面对业务中复杂的时间排序、日志记录或周期推算需求,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日期时间处理与格式化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









