在Python中解析ISO 8601日期

日期对每个人都很重要,对我们使用的许多应用程序也至关重要。作为一个开发者,面对不同的时区或时间对象,以及围绕它们开展工作,可能会有些困惑。

然而,标准的存在往往使工作更容易,这就是本文所涉及的内容。此外,我们将讨论一个典型的ISO 8601日期的结构,并向你展示如何将典型的DateTime对象解析为可在各地使用的标准化的DateTime。

ISO 8601日期的结构

ISO(国际标准化组织)致力于为其成员国创建不同领域的标准化,这通常包括技术和非技术领域。工程等领域是其重点工作的一部分。

众多的标准化包括ISO 8601 DateTime,由月、日、小时、分钟、秒和毫秒表示。它被用作全世界任何数据的DateTime标准,并且是基于时间的,这有助于防止错误的表述和错误。

如果你要建立一个在世界范围内使用的Python应用程序,理解ISO 8601 DateTime对象是很重要的,解析它可能是一个要求。

ISO 8601日期时间的表示方法是,年份从左边开始,以毫秒参数结束,并经常与其他计算机字符结合,从TZ

2022-08-10 17:00:00.000

上面的ISO DateTime对象表示2022年8月11日在当地时区的下午5点。

必须说明的是,ISO 8601 DateTime字符串要求有日期部分,但时间部分是可选的。它们是ISO 8601的不同变体,但上述内容将是本文的参考。

在Python中使用strptime()strtime() 来解析ISO 8601日期

Python预装了不同的模块,对不同的操作很有用,其中一个预装的模块是datetime ,它有助于日期和时间操作。通过datetime 模块,你可以获得datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) 的值。

now() 方法帮助我们获得和开发当前的日期和时间,并给出了典型的DateTime对象,我们可以通过操作或解析来获得我们需要的任何信息。

from datetime import datetime
todaysDate = datetime.now()
print(todaysDate)

输出:

2022-09-28 06:55:56.832983

另外,today() 方法也可以用来实现相同的值。虽然,now() 方法比today() 方法更受欢迎。

AnoTodaysDate = datetime.today()

输出:

2022-09-29 10:48:43.311880

之前,我们把典型的Python DateTime对象解析为标准化的ISO 6801 DateTime。让我们反过来,用Python DateTime 对象创建ISO 6801 DateTime。

为了达到这个目的,我们需要strftime() 方法,它可以帮助我们将DateTime对象转换成它们的字符串表示–这次是ISO 6801 DateTime字符串。

from datetime import datetime
todaysDate = datetime.now()
todaysDateInISO = todaysDate.strftime('%Y-%m-%dT%H:%M:%S.%f%z')
print(todaysDateInISO)

输出:

2022-09-29T11:08:29.413183

todaysDate 绑定了当前日期和时间的Python DateTime 对象,然后我们将该绑定作为参数传递给strftime() 方法,以创建相当于ISO 8601 DateTime 字符串。

现在有了这些,我们如何将 ISO 8601 DateTime 字符串转换成 Python DateTime 对象呢?我们需要一个与strftime() 方法相反的方法,即strptime()

这个方法从一个DateTime字符串创建一个DateTime对象。

因此,我们将传递一个ISO 6801 DateTime字符串作为strptime() 的第一个参数,以及另一个定义你想要的日期格式的参数–Python DateTime对象%Y-%m-%dT%H:%M:%SZ

parsedDate = datetime.strptime("2022-03-04T21:08:12Z", "%Y-%m-%dT%H:%M:%SZ")
print(parsedDate)

输出:

2022-03-04 21:08:12

Y-%m-%dT%H:%M:%SZ 日期格式使用Python DateTime 对象中指定的格式代码处理年、月、日、时、分和秒。

在Python中使用fromisoformat() 来解析ISO 8601日期

strftime()strptime() 方法类似,有专门的方法可以创建ISO 6801 DateTime字符串或将其转换为Python DateTime 对象。isoformat() 方法有助于返回按照ISO格式化的时间,该方法是按照YYYY-MM-DD HH:MM:SS.mmmmmm 格式处理的。

而更重要的是,fromisoformat() 方法接收ISO 8601 DateTime字符串并返回与之等价的Python DateTime对象。

要从Python DateTime对象中创建一个ISO 8601,可以先用now() 方法创建DateTime对象,然后用isoformat() 获得结果的ISO 8601属性(格式)。

from datetime import datetime
todaysDate = datetime.now()
todaysDateInISO = todaysDate.isoformat()
print(todaysDateInISO)

输出:

2022-09-28T07:46:13.350585

结果通常在日期和时间之间包含一个分隔符。在这里,它是T ,并且可以被改变。你可以通过传递一个参数来改变分隔符。

todaysDateInISO = todaysDate.isoformat("$")
print(todaysDateInISO)

输出:

2022-09-28$07:48:11.060212

现在是问题的关键,我们可以将ISO 8601 DateTime字符串解析为典型的Python DateTime对象。

parsedDate = datetime.fromisoformat(todaysDateInISO)
print(parsedDate)

输出:

2022-09-29 14:38:17.928655

使用dateutil 来解析Python中的ISO 8601日期

dateutil Python模块是一个第三方模块,你可以用它来扩展通过内置datetime 模块获得的功能。

要安装它,你可以使用pip 命令:

pip install python-dateutil

输出:

Collecting python-dateutil
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.7/247.7 kB 506.3 kB/s eta 0:00:00
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, python-dateutil
Successfully installed python-dateutil-2.8.2 six-1.16.0

此外,你还可以使用另一个名为pytz 的第三方模块来引入时区功能,该模块可以使用pip 命令安装。

pip install pytz

这些库可以很容易地根据时区创建一个ISO 8601日期格式,并将ISO 8601 DateTime字符串解析为典型的Python DateTime对象。

在这个例子中,我们将利用US/Eastern 时区,并使用timezone() 方法、now() 方法和isoformat() 方法创建一个ISO 8601 DateTime字符串。

from datetime import datetime
import pytz
usEasternDate = datetime.now(pytz.timezone('US/Eastern'))
print(usEasternDate)
usEasternDateISO = usEasternDate.isoformat()
print(usEasternDateISO)

输出:

2022-09-29 10:01:17.654150-04:00
2022-09-29T10:01:17.654150-04:00

然后将ISO 8601 DateTime字符串解析为Python DateTime对象,我们可以使用parse() 方法,将ISO日期作为其参数传递。

parsedDate = parser.parse(usEasternDateISO)
print(parsedDate)

输出:

2022-09-29 10:01:17.654150-04:00