跳转到主要内容

Python ISO 8601 日期时间解析器和数据模型/操作工具

项目描述

isodatetime

Build Status codecov DOI Codacy Badge PYPI Badge

Python ISO 8601 完整规范解析器和数据模型/操作工具。旨在与Python的datetime模块类似使用。

安装

从PyPI安装

$ pip install isodatetime

或自行构建

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

使用方法

Python API

>>> import isodatetime.parsers as parse
>>> import 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
2001-01-01T03:00:00Z

# Recurrences
>>> recurrence = parse.TimeRecurrenceParser().parse('R/1999/P1Y')
>>> recurrence.get_next(date_time)
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

ISO8601

ISO8601 是记录日期/时间信息的国际标准。

这是表示日期/时间信息的正确、国际友好且可电脑排序的数字表示方法。

良好的阅读材料

参考材料

日期和时间

我应该如何写下年份、月份和日呢?

语法 示例
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年
Pn,oY P5,5Y 5年半
Pn.oY P5.5Y 5年半
PTnM PT7M 7分钟(注意"T")
PnM P10M 10个月
PnDTnH P5DT6H 5天和6小时
PnW P2W 2周

不允许将任何其他单位与周结合。

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

重复日期时间序列

1 - 根据起始日期和后续日期之间的差异重复,从起始日期开始

示例语法

示例 含义
R/CCYY/CCYY R/2010/2014 每隔4年重复,从2010-01-01开始。
R/CCYY-MM/CCYY-DDD R/2010-01/2012-045 每隔2年44天重复,从2010-01-01开始
R5/CCYY-Www-D/CCYY-Www-D R/2015-W05-2/2015-W07-3 每隔2周和1天重复5次,从2015-W05-2开始

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年第二周的星期一开始每周重复。
R/CCYYDDDThhmm/PnD R/1996291T0630+0100/P2D 从1996年291天,06:30,UTC + 1开始每隔2天重复。
Rn/CCYY-MM-DDThh:mm/PTnH R2/19900201T06Z/PT12H 每隔12小时重复,总共2次,从1990-02-01T06Z开始。
Rn/CCYY-Www-D/PnW R5/2012-W02-1/P1W 从2012年第二周的星期一开始每周重复,总共5次。
Rn/CCYYDDDThhmm/PnD R1/1996291T0630+0100/P2D 从1996年291天,06:30,UTC + 1开始重复一次。

4 - 从特定日期时间回溯给定的时间间隔

示例 含义
R/PTnH/CCYY-MM-DDThhZ R/PT1H/2012-01-02T00Z 从2012-01-02T00Z回溯每隔一小时重复。
R/PnY/CCYY R/P3Y/2000 从2000-01-01回溯每隔3年重复。
R/PTnS/+XCCYYDDDThhmm R/PT5s/-002500012T1800 从公元前2501年12天,18:00回溯每隔5秒重复(使用2个扩展的年数字)。
Rn/PnYTnM/CCYY-MM-DDThhZ R5/P1YT5M/2012-01-02T00Z 从2012-01-02T00Z回溯每隔一年和5分钟重复。
Rn/PnM/CCYY-MM R4/P1M/2000-05 从2000-05-01回溯每月重复,总共4次。

项目详情


下载文件

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

源分发

isodatetime-1!2.0.0.tar.gz (43.0 kB 查看哈希值)

上传时间

构建分发

isodatetime-1!2.0.0-py3.7.egg (89.9 kB 查看哈希值)

上传时间

isodatetime-1!2.0.0-py3-none-any.whl (49.4 kB 查看哈希值)

上传时间 Python 3

由...