Python 日期时间变得简单。
支持 Python 3.8 及更高版本。
>>> import pendulum>>> now_in_paris = pendulum.now('Europe/Paris')>>> now_in_paris'2016-07-04T00:49:58.502116+02:00'# 无缝时区切换>>> now_in_paris.in_timezone('UTC')'2016-07-03T22:49:58.502116+00:00'>>> 明天 = pendulum.now().add(days=1)>>> last_week = pendulum.now() .subtract(周=1)>>> 过去 = pendulum.now().subtract(分钟=2)>>> past.diff_for_ humans()'2 分钟前'>>> delta =过去 - last_week>>> delta.hours23>>> delta.in_words(locale='en')'6 天 23 小时 58 分钟'# 正确处理日期时间标准化>>> pendulum.datetime(2013, 3, 31, 2, 30, tz='Europe/Paris')'2013-03-31T03:30:00+02:00' # 2:30 不存在(跳过时间)# 正确处理夏令时转换>>> just_before = pendulum.datetime(2013 , 3, 31, 1, 59, 59, 999999, tz='欧洲/巴黎')'2013-03-31T01:59:59.999999+01:00'>>> just_before.add(microseconds=1)'2013-03-31T03:00:00+02:00'
官方网站
文档
问题跟踪器
原生datetime
实例足以满足基本情况,但当您面对更复杂的用例时,它们通常会显示出局限性并且使用起来不太直观。 Pendulum
提供了更干净、更易于使用的 API,同时仍然依赖于标准库。所以它仍然是datetime
,但更好。
与 Python 的其他日期时间库不同,Pendulum 是标准datetime
类(它继承自它)的直接替代品,因此,基本上,您可以用代码中的DateTime
实例替换所有datetime
实例(检查的库存在例外)例如,使用sqlite3
或PyMySQL
等type
函数来确定对象的类型)。
它还消除了天真的日期时间的概念:每个Pendulum
实例都是时区感知的,并且默认采用UTC
以便于使用。
Pendulum 还通过提供更直观的方法和属性来改进标准timedelta
类。
尽管DateTime
类是datetime
的子类,但在极少数情况下它无法直接替换本机类。以下是已报告案例的列表(非详尽)以及可能的解决方案(如果有):
sqlite3
默认会使用type()
函数来判断对象的类型。要解决此问题,您可以注册一个新适配器:
from pendulum import DateTimefrom sqlite3 import register_adapterregister_adapter(DateTime, lambda val: val.isoformat(' '))
mysqlclient
(以前的MySQLdb
)和PyMySQL
将默认使用type()
函数来确定对象的类型。要解决此问题,您可以注册一个新适配器:
导入 MySQLdb.converters导入 pymysql.convertersfrom pendulum 导入 DateTimeMySQLdb.converters.conversions[DateTime] = MySQLdb.converters.DateTime2literalpymysql.converters.conversions[DateTime] = pymysql.converters.escape_datetime
django
将使用isoformat()
方法将日期时间存储在数据库中。然而,由于pendulum
始终了解时区,因此isoformat()
始终会返回偏移信息,从而引发错误,至少对于 MySQL 数据库而言是这样。要解决此问题,您可以创建自己的DateTimeField
或使用之前的MySQLdb
解决方法:
from django.db.models import DateTimeField as BaseDateTimeFieldfrom pendulum import DateTimeclass DateTimeField(BaseDateTimeField):def value_to_string(self, obj):val = self.value_from_object(obj)if isinstance(value, DateTime):return value.to_datetime_string()return ' ' 如果 val 是 None val.isoformat()
欢迎贡献,尤其是本地化方面的贡献。
要使用 Pendulum 代码库,您需要在本地克隆项目并通过诗歌安装所需的依赖项。
$ git克隆 [email protected]:sdispater/pendulum.git $ 诗歌安装
如果您想帮助本地化,有两种不同的情况:区域设置已经存在或不存在。
如果区域设置不存在,您将需要使用clock
实用程序创建它:
./clock locale create <您的区域设置>
它将在pendulum/locales
中生成一个以您的语言环境命名的目录,其结构如下:
<您的区域设置>/
- 自定义.py
- 语言环境.py
不得修改locale.py
文件。它包含 CLDR 数据库提供的翻译。
custom.py
文件是您要修改的文件。它包含 Pendulum 所需但 CLDR 数据库未提供的数据。你可以以en数据为参考,看看需要哪些数据。
您还应该为创建或修改的区域设置添加测试。