问题
我正在开发一个Python应用程序,它分析用户输入,并尝试找出如何重新生成它。其中一部分是将任意格式的日期/时间/日期时间作为字符串提取,并检测格式是什么。
示例
23-09-1992
,我应该能够生成格式%d-%m-%Y
13:09
,我应该能够生成格式%h:%m
理想情况下,这应该通用,所以我可以提供任何常见的日期、时间或日期时间字符串,它会为我推断出格式。
我的尝试
我试图建立一个已知日期时间/日期/时间格式的列表,但很快意识到我可以在这里直到我死,所以决定不这样做。
我已经进入了
dateutils.parser
的代码,看看里面的东西是否有帮助,但我不认为它可以。看起来并没有生成格式,而是直接构建了datetime
对象。
dateutil 可以解析日期时间对象,但不直接提供使用的格式字符串。使用 dateutil.parser.parse 将输入字符串转换为日期时间对象。一旦我们有了 datetime 对象,我们就可以通过测试哪些 strftime 格式说明符与您获得的 datetime 对象的组件相匹配来对格式进行逆向工程。
import dateutil.parser
from datetime import datetime
def deduce_datetime_format(date_string):
try:
# Parse the date string into a datetime object
parsed_date = dateutil.parser.parse(date_string, fuzzy=True)
# Create a dictionary of datetime components
components = {
"%d": parsed_date.day,
"%m": parsed_date.month,
"%Y": parsed_date.year,
"%H": parsed_date.hour,
"%M": parsed_date.minute,
"%S": parsed_date.second
}
# Try to match the format by reconstructing the string from components
format_string = ""
for key in components:
if components[key] != 0: # Check if the component is part of the input string
if datetime.strftime(parsed_date, key) == str(components[key]).zfill(2):
format_string += key
elif datetime.strftime(parsed_date, key).lstrip("0") == str(components[key]):
format_string += key.lstrip("%0")
return format_string.replace("%", "%-").replace("-", "0") # Construct strftime format string
except ValueError:
return "Invalid date string"
# Example usage
date_format = deduce_datetime_format("23-09-1992")
time_format = deduce_datetime_format("13:09")
print(f"Date format: {date_format}")
print(f"Time format: {time_format}")
这个脚本非常基础,可能需要根据您期望处理的输入范围进一步完善。