在Python中解析ISO 8601日期
日期对每个人都很重要,对我们使用的许多应用程序也至关重要。作为一个开发者,面对不同的时区或时间对象,以及围绕它们开展工作,可能会有些困惑。
然而,标准的存在往往使工作更容易,这就是本文所涉及的内容。此外,我们将讨论一个典型的ISO 8601日期的结构,并向你展示如何将典型的DateTime对象解析为可在各地使用的标准化的DateTime。
ISO 8601日期的结构
ISO(国际标准化组织)致力于为其成员国创建不同领域的标准化,这通常包括技术和非技术领域。工程等领域是其重点工作的一部分。
众多的标准化包括ISO 8601 DateTime,由月、日、小时、分钟、秒和毫秒表示。它被用作全世界任何数据的DateTime标准,并且是基于时间的,这有助于防止错误的表述和错误。
如果你要建立一个在世界范围内使用的Python应用程序,理解ISO 8601 DateTime对象是很重要的,解析它可能是一个要求。
ISO 8601日期时间的表示方法是,年份从左边开始,以毫秒参数结束,并经常与其他计算机字符结合,从T
到Z
。
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