首页 > 解决方案 > datetime.strptime 基于正则表达式模式检查

问题描述

我正在使用以下功能

def convStr2Date(given):

    if type(given) != str:
        return given
    pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|.*)'
    rv = re.search(pattern, given).group(1)
    if rv:
        return datetime.strptime(rv, '%Y-%m-%d %H:%M:%S')

这给了我错误ValueError: time data '2021-10-01' does not match format '%Y-%m-%d %H:%M:%S

所以我添加了一个else:语句,但仍然得到同样的错误,我哪里出错了?

试:

def convStr2Date(given):
    if type(given) != str:
        return given
    pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|.*)'
    rv = re.search(pattern, given).group(1)
    if rv:
        return datetime.strptime(rv, '%Y-%m-%d %H:%M:%S')
    else:
        return datetime.strptime(rv, '%Y-%m-%d')

标签: pythondatetime

解决方案


如果你不关心确切的模式,你可以只测试一个空间。无论如何,您的代码在其他日期模式上都会失败。

from datetime import datetime

def convStr2Date(given: str) -> datetime:
  if not isinstance(given, str):
    raise ValueError(f"{given!r} is not a string")
  date_format = '%Y-%m-%d'
  if ' ' in given :
    date_format = '%Y-%m-%d %H:%M:%S'
  return datetime.strptime(given, date_format)

例子

for d in ['2021-10-02', '2018-10-20 01:21:23', 'not a date', 'notADate', 2, None]:
  try:
    print(convStr2Date(d)) 
  except ValueError as e:
    print(e)

输出

2021-10-02 00:00:00
2018-10-20 01:21:23
time data 'not a date' does not match format '%Y-%m-%d %H:%M:%S'
time data 'notADate' does not match format '%Y-%m-%d'
2 is not a string
None is not a string

推荐阅读