跳转到主要内容

Python ISO 8601 日期时间解析器和数据模型/操作实用程序

项目描述

isodatetime

Test codecov DOI Codacy Badge PYPI Badge

Python ISO8601 (2004) 完整规范解析器和数据模型/操作实用程序。旨在以类似Python的datetime模块的方式使用。

安装

从PyPI安装

$ pip install metomi-isodatetime

或自行构建

$ git clone https://github.com/metomi/isodatetime.git isodatetime
$ cd isodatetime
$ python setup.py install

用法

Python API

>>> import metomi.isodatetime.parsers as parse
>>> import metomi.isodatetime.dumpers as dump

# Dates and times
>>> date_time = parse.TimePointParser().parse('2000-01-01T00:00Z')
>>> date_time.month_of_year
1

# Durations
>>> duration = parse.DurationParser().parse('P1YT3H')
>>> duration.get_days_and_seconds()
(365.0, 10800.0)
>>> date_time + duration
<metomi.isodatetime.data.TimePoint: 2001-01-01T03:00:00Z>

# Recurrences
>>> recurrence = parse.TimeRecurrenceParser().parse('R/1999/P1Y')
>>> recurrence.get_next(date_time)
<metomi.isodatetime.data.TimePoint: 2001-01-01T00:00:00Z>

# Output
>>> dump.TimePointDumper().strftime(date_time, '%d/%M/%Y %H:%M:%S')
'01/00/2000 00:00:00'

命令行界面

$ isodatetime
2000-01-01T00:00:00Z
$ isodatetime 1066
1066
$ isodatetime 1066 --offset P1Y
1067
$ isodatetime R/2000/P1Y --max 3
2000-01-01T00:00:00Z
2001-01-01T00:00:00Z
2002-01-01T00:00:00Z

版权和免责声明

版权(C)2013-2023 英国皇家(气象办公室)及贡献者。

本程序是自由软件:您可以在自由软件基金会发布的GNU较小通用公共许可证的条款下重新分配它和/或修改它,无论是许可证的第三版,还是(根据您的选择)任何更新版本。

本程序的分发是希望它是有用的,但没有任何保证;甚至没有关于其商销性或适用于特定目的的隐含保证。有关详细信息,请参阅GNU通用公共许可证。

您应已随本程序收到GNU较小通用公共许可证的一份副本。如果没有,请参阅GNU许可证

ISO 8601

ISO 8601 (2004) 是一个国际标准,用于记录日期/时间信息。

这是正确、国际友好、计算机可排序的日期/时间信息的数值表示方式。

阅读材料

参考资料

日期和时间

我该如何记录年份、月份和月份中的日期呢?

语法 示例
CCYYMMDD 20151231
CCYY-MM-DD 2015-12-31

关于记录年份、年份中的周和周中的日期呢?

语法 示例
CCYYWwwD 2015W534
CCYY-Www-D 2015-W53-4

关于记录年份和年份中的日期呢?

语法 示例
CCYYDDD 2015365
CCYY-DDD 2015-365

我该如何只记录年份?

可以是:CCYY+XCCYY

+X 代表一个正号或负号(+-),后面跟着一个固定、约定的年数字符扩展数(X)。例如,如果我们同意有2个年数字符扩展,我们可以表示从-999999到+999999(公元前1000000年到公元后999999年)的年份。请注意,公元前1年是ISO 8601使用的推算格里高利历中的年份0。

例如,您可以将公元1995年写为:1995+001995(使用2个年数字符扩展)。

注意:如果您只记录年份而意味着一个确切的日期,则表示该年的1月1日 - 1995 表示 1995-01 => 1995-01-01 => 1995-01-01T00 => 1995-01-01T00:00 => 1995-01-01T00:00:00

我该如何只记录年份和月份?

可以是:CCYY-MM+XCCYY-MM(这里的+代表一个正号或负号)

不允许:CCYYMM+XCCYYMM

我该如何记录年份在9999之后和0000之前?

语法 示例(2个年数字符扩展)
+XCCYYMMDD +0020151231
+XCCYY-MM-DD +002015-12-31
+XCCYYWwwD +002015W534
+XCCYY-Www-D +002015-W53-4
+XCCYYDDD +002015365
+XCCYY-DDD +002015-365

我该如何单独记录时间信息?

语法 示例
hhmmss 083000
hhmm 0830
hh:mm:ss 17:45:01
hh:mm 17:45
hh 08

我该如何在ISO 8601中记录日期中的时间信息?

在日期后写上时间,并用T分隔

语法 示例
CCYYMMDDThhmmss 20151231T063101
CCYY-MM-DDThh:mm:ss 2015-12-31T06:31:01
CCYYWwwDThhmmss 2015W534T063101
CCYY-Www-DThh:mm:ss 2015-W53-4T06:31:01
CCYYDDDThhmmss 2015365T063101
CCYY-DDDThh:mm:ss 2015-365T06:31:01

关于日期中的仅小时和分钟呢?

语法 示例
CCYYWwwDThhmm 2015W534T0631
CCYY-Www-DThh:mm 2015-W53-4T06:31

关于日期中的仅小时呢?

语法 示例
CCYYMMDDThh 20151231T06
CCYY-MM-DDThh 2015-12-31T06

关于小时、分钟或秒的小数部分呢?

使用逗号或句点分隔小数部分,并不要包含任何更小的单位

语法 示例
CCYYMMDDThh,ii 20151231T06,5
CCYYMMDDThh.ii 20151231T06.5
CCYYMMDDThhmm,nn 20151231T0631,3333
CCYYMMDDThhmm.nn 20151231T0631.3333
CCYYMMDDThhmmss,tt 20151231T063101,25671
CCYYMMDDThhmmss.tt 20151231T063101.25671

如何指定时区?

如果是UTC时区,使用“Z”,否则使用与UTC相差的小时和分钟数。

请注意,这个差异是(时区 - UTC),因此位于0度经度东部的时区通常具有正值差异,而位于0度经度西部的时区通常具有负值差异。

语法 示例
CCYYMMDDThhmmssZ 20151231T063101Z
CCYY-MM-DDThh:mm:ssZ 2015-12-31T06:31:01Z
CCYYMMDDThhmmss-hh 20151231T013101-05
CCYY-MM-DDThh:mm:ss-hh 2015-12-31T01:31:01-05
CCYYMMDDThhmmss+hh 20151231T083101+02
CCYY-MM-DDThh:mm:ss+hh 2015-12-31T08:31:01+02
CCYYMMDDThhmmss-hhmm 20151230T203101-1000
CCYY-MM-DDThh:mm:ss-hh:mm 2015-12-30T20:31:01-10:00
CCYYMMDDThhmmss+hhmm 20151231T193101+1300
CCYY-MM-DDThh:mm:ss+hh:mm 2015-12-31T19:31:01+13:00

持续时间

如何用X单位写下一段时间?

一个“P”,后面跟着单位的数量(可选包括小数部分),然后是一个设计符来标记单位

单位类型 单位设计符
Y
M
W
D
小时 H
分钟 M
S

如果单位是小时、分钟或秒之一,需要在时间前加一个“T”来区分日期和时间

语法 示例 意义
PnY P2Y 2年
PTnM PT7M 7分钟(注意“T”)
PnM P10M 10个月
PnDTnH P5DT6H 5天和6小时
PTn,oH PT5,5H 5个半小时
PTn.oH PT5.5H 5个半小时
PnW P2W 2周

不允许将任何其他单位与周结合。小数只能用于小时、分钟和秒。

请注意,年和月是“名义”持续时间,其确切长度取决于其在日历中的位置。例如,1个日历年的持续时间从某个月某天的某一天开始,到下一年同一月份同一天的当天结束,可能因闰年而不同于格里高利历中的365天。

相反,周、天、小时、分钟和秒是精确单位,因此 P1W == P7DP1D == PT24HPT1H == PT60M 等等总是正确的。(尽管ISO 8601指定周和天是名义持续时间,但在我们的实现中,它们都不是不精确的。)

一个补充格式(需要在事先达成一致)是指定类似日期时间的持续时间(PCCYY-MM-DDThh:mm:ss),其中给出的年、月、日、小时、分钟和秒的数字被直接使用(P1995-00-00T00:10:00 = P1995YT10M)。

重复日期时间系列

1. 根据起始日期和后续日期之间的差异进行重复

示例语法 示例 意义
R/CCYY/CCYY R/2010/2014 每隔1461天(≈ 4年*),从2010-01-01开始重复
R/CCYY-MM/CCYY-DDD R/2010-01/2012-045 每隔774天(≈ 2年和44天*),从2010-01-01开始重复
Rn/CCYY-Www-D/CCYY-Www-D R5/2015-W05-2/2015-W07-3 每隔15天(= 2周加1天),重复5次,从2015-W05-2开始
Rn/CCYY-MM-DDThh/CCYY-MM-DDThh R1/1925-02-11T00Z/2027-06-01T00Z 在1925-02-11T00Z重复一次(注意结束日期时间被忽略)

*有关为什么只给出近似年数的原因,请参阅前面的部分。

2. 从指定的持续时间,从上下文日期时间开始重复

(您必须在别处提供上下文)

示例语法 示例 意义
R/PnMnDTnM R/P10M3DT45M 从上下文起始日期和时间开始,每10个月重复一次,间隔3天和45分钟。
Rn/PnY R2/P4Y 从上下文起始日期和时间开始,每4年重复一次,总共重复2次。

3. 从特定日期和时间开始,以指定持续期重复

示例语法 示例 意义
R/CCYYMMDDThhZ/PTnH R/20201231T00Z/PT12H 从2020-12-31T00Z开始,每12小时重复一次。
R/CCYY-Www-D/PnW R/2012-W02-1/P1W 从2012年的第二个ISO周开始每周重复一次。
R/CCYYDDDThhmm/PnD R/1996291T0630+0100/P2D 从1996年的第291天开始,每2天重复一次,时间为06:30,UTC + 1。
Rn/CCYY-MM-DDThh:mm/PTnH R2/19900201T06Z/PT12H 从1990-02-01T06Z开始,每12小时重复一次,总共重复2次。
Rn/CCYY-Www-D/PnW R5/2012-W02-1/P1W 从2012年的第二个ISO周开始每周重复一次,总共重复5次。
Rn/CCYYDDDThhmm/PnD R1/1996291T0630Z/P2D 在1996年的第291天重复一次,时间为06:30(注意持续时间被忽略)。

4. 以特定日期和时间结束,以指定持续期重复

重复的开始日期和时间是从指定的持续时间计算得出的。

示例语法 示例 意义
R/PTnH/CCYY-MM-DDThhZ R/PT1H/2012-01-02T00Z 每小时重复一次,结束时间为2012-01-02T00Z(因此每小时重复)。
R/PnY/CCYY R/P3Y/2000 每3年重复一次,结束时间为2000-01-01(因此重复在1月1日午夜)。
R/PTnS/+XCCYYDDDThhmm R/PT5s/-002500012T1800 每5秒重复一次,结束时间为公元前2501年的第12天18:00(使用2个扩展的年份数字)。
Rn/PnYTnM/CCYY-MM-DDThhZ R5/P1YT5M/2012-01-02T00Z 每一年和5分钟重复一次,总共重复5次,结束时间为2012-01-02T00Z。
Rn/PnM/CCYY-MM R4/P1M/2000-05 每月重复四次,结束时间为2000-05-01(因此每月在1日重复)。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分发

metomi-isodatetime-1!3.1.0.tar.gz (74.3 kB 查看哈希)

上传时间

构建分发

metomi_isodatetime-1!3.1.0-py3-none-any.whl (81.7 kB 查看哈希)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面