检查日期时间字符串是否为ISO 8601格式

7 投票
1 回答
6458 浏览
提问于 2025-04-17 20:34

我喜欢用 dateutil.parser.parse 模块来解析日期时间字符串,这样做很简单。不过我发现,在我的代码里,我需要检查一下这个对象是否确实是8601格式的(并且是有时区的)。

我的结构是:

if parse(datetime).tzinfo==None:
   #do something
else:
   #make it aware
   #do something

我想实现的效果是:

if <IS-8601>:
   if parse(datetime).tzinfo==None:
      #do something
   else:
      #make it aware
      #do something
else:
   pass

如果我有一个8601格式的字符串,比如 2014-02-28T22:30:00+0200,解析工具就能正常工作。

但是如果我有一个像 2014-03-20 这样的字符串,解析后会在这个对象上加上时间。这并不是错误,只是我不想要的结果:2014-03-20 00:00:00


那么我该如何检查一个对象是否是8601格式的呢?如果是8601格式的,它又是否有时区信息呢?我不介意换用其他的日期时间库。

1 个回答

1

你可以使用datetime模块来解析它,并在通过dateutil.parser.parse处理之前检查是否有异常ValueError

>>> import datetime
>>> datetime.datetime.strptime("2014-03-20", '%Y-%m-%d')
datetime.datetime(2014, 3, 20, 0, 0)
>>> datetime.datetime.strptime("2014-02-28T22:30:00+0200", '%Y-%m-%d')
Traceback (most recent call last):
  File "<pyshell#134>", line 1, in <module>
    datetime.datetime.strptime("2014-02-28T22:30:00+0200", '%Y-%m-%d')
  File "C:\Python33\lib\_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:\Python33\lib\_strptime.py", line 340, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: T22:30:00+0200

撰写回答