操作日期时间是每个Python程序员都绕不开的话题。Python内置的datetime模块虽说功能齐全,但用起来总觉得不够顺手。要写个时区转换得绕好几道弯,算个日期差还得小心翼翼防止踩坑。今天跟大家介绍个好东西 -Pendulum库,它是datetime的超集,API设计特别人性化,用起来贼舒服。
安装配置
1pip install pendulum
装好就能用,简单吧?记得先import:
1import pendulum
创建时间对象
不像datetime那样要记一大堆参数位置,Pendulum创建时间对象超级简单:
1# 获取当前时间
2now = pendulum.now()
3print(now) # 2024-10-29T15:30:25.123456+08:00
5# 创建指定时间
6dt = pendulum.datetime(2024, 10, 1)
7print(dt) # 2024-10-01T00:00:00+08:00
9# 解析时间字符串
10dt = pendulum.parse('2024-10-01 15:30:00')
11print(dt) # 2024-10-01T15:30:00+08:00
小贴士:
Pendulum默认就会处理时区信息,不用额外操心
parse()方法支持各种常见的时间格式,不用写烦人的format字符串
创建的时间对象都是不可变的,避免了意外修改的问题
时间计算
日期计算是最容易把人搞晕的,看看Pendulum有多优雅:
1dt = pendulum.now()
3# 加减运算
4dt.add(days=1) # 加一天
5dt.subtract(weeks=2) # 减两周
6dt.add(years=1, months=2) # 加1年2个月
8# 显示人性化的时间差
9diff = dt.diff(dt.add(days=3))
10print(diff.in_words()) # '3天后'
12# 日期区间
13period = dt.range('days', dt.add(days=3))
14for d in period:
15 print(d) # 每天的日期
时区处理
时区转换在Pendulum里简直就是玩儿:
1# 创建带时区的时间
2dt = pendulum.now('America/New_York')
5# 转换时区
6tokyo = dt.in_timezone('Asia/Tokyo')
7print(tokyo) # 自动转换为东京时间
9# 时区列表
10zones = pendulum.timezones
11print(zones) # 所有可用时区
小贴士:
in_timezone()方法会自动处理夏令时
时区名称用标准的IANA时区名,别用GMT/UTC偏移
时区转换会保持时间点不变,只改变显示方式
格式化输出
输出格式化也是超级简单:
1dt = pendulum.now()
3# 常用格式
4print(dt.to_date_string()) # 2024-10-29
5print(dt.to_time_string()) # 15:30:25
6print(dt.to_datetime_string()) # 2024-10-29 15:30:25
8# 自定义格式
9print(dt.format('YYYY年MM月DD日')) # 2024年10月29日
11# 本地化
12print(dt.format('dddd', locale='zh')) # 星期二
小贴士:
format()方法支持各种简单好记的格式化占位符
locale参数支持多语言输出,再也不用自己转换星期几了
用了这么久Python,还是第一次见到处理时间这么爽的库。它把datetime、pytz、dateutil这些库的功能都整合在一起,API设计得特别统一。虽说依赖包会大点,但只要项目里有时间处理的需求,我都会毫不犹豫地用它。
代码仓库:## 高级特性玩法
真要说Pendulum厉害的地方,那就得看看这些骚操作:
1# 日期测试
2dt = pendulum.datetime(2024, 10, 29)
3print(dt.is_tuesday()) # True
4print(dt.is_weekend()) # False
5print(dt.is_future()) # True
6print(dt.is_leap_year()) # True
好家伙,直接一个方法就知道是不是周二,多直观。跟写if dt.weekday() == 1比起来不知道高到哪里去了。
日期区间骚操作
1# 创建一个时间区间
2dt1 = pendulum.datetime(2024, 1, 1)
3dt2 = pendulum.datetime(2024, 12, 31)
4period = pendulum.period(dt1, dt2)
6# 遍历每个月
7for dt in period.range('months'):
8 print(dt.format('YYYY-MM'))
10# 统计区间信息
11print(period.years) # 0
12print(period.months) # 11
13print(period.days) # 365
14print(period.in_days()) # 365
小贴士:
range()方法支持years、months、days、hours等单位
区间可以用来检查某个日期是否在范围内
in_days()这种方法直接给你总天数,不用自己算
相对时间处理
1# 获取特定时间点
2dt = pendulum.now()
3print(dt.start_of('day')) # 当天0点
4print(dt.end_of('month')) # 当月最后一秒
5print(dt.next(pendulum.MONDAY)) # 下个周一
6print(dt.previous(pendulum.FRIDAY)) # 上个周五
8# 相对时间描述
9past = dt.subtract(hours=2)
10print(past.diff_for_humans()) # '2小时前'
12future = dt.add(days=1)
13print(future.diff_for_humans()) # '1天后'
实用小技巧
处理时间戳转换:
1# 时间戳互转
2timestamp = pendulum.now().timestamp()
3dt = pendulum.from_timestamp(timestamp)
5# Unix时间戳(秒级)
6unix_ts = pendulum.now().int_timestamp
获取一段时期:
1dt = pendulum.now()
3# 获取本周日期
4week_start = dt.start_of('week')
5week_dates = week_start.range('days', week_start.end_of('week'))
7# 获取本月所有周一
8dt = dt.start_of('month')
9mondays = dt.end_of('month').every(pendulum.MONDAY)
小贴士:
timestamp默认是浮点数(微秒级),用int_timestamp获取整数(秒级)
用range和every可以轻松获取一段时间内的特定日期
start_of和end_of支持year、month、week、day等单位
Pendulum其实还有不少好玩的功能,像duration(时间段)、testing(时间测试)之类的。不过最常用的也就这些了。真要啥功能查文档就完事了。反正有了这玩意,写时间处理的代码再也不怕了。
平时写代码处理时间的时候,datetime老让我头大。自从用上了Pendulum,那感觉就像换了个人生。API设计得太合理了,上手特别快,代码看着也特别清爽。以后要是有朋友问我Python怎么处理时间,我第一个就推荐这个。
领取专属 10元无门槛券
私享最新 技术干货