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

7
我喜欢使用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
你可以使用正则表达式。re.compile(r'^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$') - Priyank Patel
ISO 8601 可以在结尾处带有时区字符,例如 Z 而不是偏移量,并且还可以包含毫秒。 - Mark Lakata
1个回答

1
你可以使用 datetime 模块解析它,并在处理之前通过检查异常 ValueError 来使用dateutil.parser.parse
>>> 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

1
这个解析器可以解析比ISO8601更多的字符串,因此它不是验证ISO8601合规性的好方法。 - Pieter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接