跳转至

pendulum 处理日期时间

概要: 一个更加易用和强大的处理日期时间的第三方包

创建时间: 2022.09.28 23:28:42

更新时间: 2023.07.28 22:43:23

日期时间获取

获取常用的日期时间

Python
1
2
3
4
5
6
import pendulum

pendulum.now()
pendulum.today()
pendulum.tomorrow()
pendulum.yesterday()
image.png

获取日期的详细信息

pendulum可以轻松获取指定日期时间的年月日时分秒和星期几信息,示例如下

Python
dt = pendulum.now()
image.png

获取周期的开始和结束

pendulum可以轻松获取指定日期时间的某个周期的开始和结束,主要调用方法为 start_ofend_of ,此外周期的单位 unit 可以是 second , minute , hour , day , week , month , year , decade , century

Python
dt.start_of(unit)
dt.end_of(unit)

获取周期开始

image.png
image.png

获取周期结束

image.png
image.png

获取相对星期几

pendulum可以轻松获取指定日期时间是星期几 day_of_week 和 本年第几天 day_of_year,本月共多少天 days_in_month、也可以获取它的上一个或下一个星期几,主要调用方法 nextprevious ,一周七天都可以使用类似 pendulum.MONDAY 的方式导入
image.png
当然,也可以获取当前周是本月和本年度的第几周
image.png

日期时间计算

对于指定的日期时间,pendulum 可以直接利用 addsubtract 方法进行加减计算,最高精确到毫秒,且支持小数和负数运算
image.png
image.png

Python
1
2
3
4
dt = pendulum.now()

dt.add(years=1, months=1, days=1, hours=1, minutes=1, seconds=1, microseconds=1)
dt.subtract(years=1, months=1, days=1, hours=1, minutes=1, seconds=1, microseconds=1)
image.png
image.png

与字符串转换

日期时间实例化

如果只是实例化一个日期,可以调用 pendulum.date(year, month, day)方法,如果需要实例化一个日期时间,则可以调用 pendulum.date(year, month, day, hour, minute, second) 方法(还可以附上毫秒和时区信息)

Python
1
2
3
pendulum.date(2022, 9, 30)
pendulum.datetime(2022, 9, 30, 12, 25, 35)
pendulum.datetime(2022, 9, 30, 12, 25, 35, 232541, 'Asia/Shanghai')
image.png

日期时间转字符串

pendulum可以将实例化的 DateTime 对象转化为各种形式的字符串日期时间,我们可以使用pendulum的格式(详见 Tokens | Pendulum),也可以使用标准库 datetime 的格式

Python
1
2
3
dt = pendulum.datetime(2022, 9, 30, 12, 25, 35)
dt.format('YYYY-MM-DD HH:mm:ss')
dt.strftime('%Y-%m-%d %H:%M:%S')
image.png
除了基本的日期时间格式外,pendulum还支持常用的数据交换格式和标准日期时间格式
image.png
举例如下
Python
dt = pendulum.datetime(2022, 9, 30, 12, 25, 35)

# 常用格式
dt.to_date_string()
dt.to_time_string()
dt.to_datetime_string()
dt.to_day_datetime_string()
dt.to_formatted_date_string()

# 交换格式
dt.to_atom_string()
dt.to_cookie_string()
dt.to_rss_string()
dt.to_w3c_string()

# 标准格式
dt.to_iso8601_string()
dt.to_rfc1036_string()
dt.to_rfc1123_string()
dt.to_rfc2822_string()
dt.to_rfc3339_string()
dt.to_rfc822_string()
dt.to_rfc850_string()
image.png
image.png
image.png

字符串转日期时间

如果要将字符串时间转成 pendulum 的 DateTime 对象,也可以使用与标准库 datetime 相同的 strptime 方法,
image.png
当然,也可以让 pendulum 自动解析字符串,非常智能

Python
1
2
3
4
pendulum.parse('2022-09-30')
pendulum.parse('12:25:35')
pendulum.parse('2022-09-30 12:25:35')
pendulum.parse('2022-09-30 13:20:10', tz='Asia/Shanghai')
image.png

警告

如果使用 pendulum.parse 仅解析时间字符串,那么日期默认为当天

对于可能无法严格识别的格式,可以在解析时关闭 strict 模式,上一小节的所有格式都可以被正确解析

Python
pendulum.parse('Fri, Sep 30, 2022 12:25 PM', strict=False)
pendulum.parse(' 9 30, 2022', strict=False)

pendulum.parse('2022-09-30T12:25:35+00:00', strict=False)
pendulum.parse('Friday, 30-Sep-2022 12:25:35 UTC', strict=False)
pendulum.parse('Fri, 30 Sep 2022 12:25:35 +0000', strict=False)
pendulum.parse('2022-09-30T12:25:35+00:00', strict=False)

pendulum.parse('2022-09-30T12:25:35Z', strict=False)
pendulum.parse('Fri, 30 Sep 22 12:25:35 +0000', strict=False)
pendulum.parse('Fri, 30 Sep 2022 12:25:35 +0000', strict=False)
pendulum.parse('Fri, 30 Sep 2022 12:25:35 +0000', strict=False)
pendulum.parse('2022-09-30T12:25:35+00:00', strict=False)
pendulum.parse('Fri, 30 Sep 22 12:25:35 +0000', strict=False)
pendulum.parse('Friday, 30-Sep-22 12:25:35 UTC', strict=False)
image.png

处理时区

获取时区

Python
pendulum.tz.get_local_timezone()
image.png

时区切换

Python
1
2
3
dt = pendulum.now()
dt.timezone.name
dt.in_timezone("America/New_York")
image.png

时区计算

Python
1
2
3
4
cn = pendulum.datetime(2022, 1, 1, 1, 2, 3, tz="Asia/Shanghai")
us = pendulum.datetime(2022, 1, 1, 1, 2, 3, tz="America/New_York")

diff = cn.diff(us)
此时得到的 diff 是一个时间范围,可以用不同的单位获取时差精度
image.png
除了计算以上两个时间获取时差外,还可以比较两地时间的大小
image.png

人性化显示时间

本地化

pendulum支持以本地化的形式显示时间,示例如下

Python
1
2
3
4
5
6
dt = pendulum.now()
dt.format('dddd DD MMMM YYYY', locale='zh')
dt.format('dddd DD MMMM YYYY', locale='en')
dt.format('dddd DD MMMM YYYY', locale='fr')
dt.format('dddd DD MMMM YYYY', locale='ru')
dt.format('dddd DD MMMM YYYY', locale='de')
image.png

人性化

除了上面的功能,pendulum还可以以几天前,几分钟后等形式显示日期

Python
1
2
3
dt = pendulum.now().add(minutes=34)
dt.diff_for_humans(locale='zh')
dt.diff_for_humans(locale='en')
image.png

提示

如果不想频繁在方法中使用 locale 参数,也可以使用 pendulum.set_locale('zh') 全局配置本地化策略

Python
1
2
3
pendulum.set_locale('zh')
dt = pendulum.now().add(days=370, hours=15, minutes=23)
dt.diff(pendulum.now()).in_words()
image.png

参考