Php 来自不同格式字符串的日期和时间

Php 来自不同格式字符串的日期和时间,php,datetime,Php,Datetime,客户正在为我的团队创建票据,并在不同时间完成任务。日期和时间写在描述中,但格式可能因每张票而异,例如: Todo:4月26日星期四19点 Todo:2018年4月25日星期三14:00至14:30 Todo:2004年4月25日星期一11点到11点30分之间 待办事项:2018年3月30日13时30分至14时00分 我创建了一个函数,该函数接受包含日期和时间的字符串(在冒号上分解后),并尝试将其转换为标准格式,该格式可在datetime local字段中使用(不关心秒数) 如您所见,我已经创建了

客户正在为我的团队创建票据,并在不同时间完成任务。日期和时间写在描述中,但格式可能因每张票而异,例如:

Todo:4月26日星期四19点

Todo:2018年4月25日星期三14:00至14:30

Todo:2004年4月25日星期一11点到11点30分之间

待办事项:2018年3月30日13时30分至14时00分

我创建了一个函数,该函数接受包含日期和时间的字符串(在冒号上分解后),并尝试将其转换为标准格式,该格式可在
datetime local
字段中使用(不关心秒数)

如您所见,我已经创建了一个包含大约20种格式的数组,我正在循环使用这些格式,只要字符串与格式匹配,我就会返回格式化日期。为了实现这一点,我必须在数组中更通用的格式之前添加更具体的格式

这个函数适用于我迄今为止遇到的80-90%的情况,不包括打字错误或字符串,这些情况甚至人类无法阅读

问题是,客户可能会随机决定,比如说,添加一个逗号来分隔日名称和日期,或者反转日数和月,在这种情况下,我必须创建一种新格式

一个简单的例子:

$datetime = "Monday, 08 January at 8:00 am";
$formats[] = "*# d F * g#i a+";

$datetime = "Thursday, April 18 at 7:30 pm";
$formats[] = "*# F d * g#i a+";
在创建此函数之前,我尝试使用
preg\u replace
str\u replace
仅保留字符串中所需的内容,然后将其传递给
strotime
,但情况肯定更糟

我的问题是,有没有更好的方法?如果不是,我至少可以做一些简单的事情来避免对非常相似的字符串使用许多格式(如前2种格式)


谢谢

好吧,为了避免格式太多,那么你需要限制你的客户端提供这些信息的方式(例如:对于web应用程序,而不是使用文本框,用户可以在其中放置任意格式的自由文本,使用仅返回特定格式的日历控件),这可以避免输入错误和无效日期(例如2月30日)


否则,正如您所说,客户端可以继续添加新格式:)

一些浏览器支持
日期
输入类型:这当然是完美的解决方案,但不幸的是,我无法控制它。。。
$datetime = "Monday, 08 January at 8:00 am";
$formats[] = "*# d F * g#i a+";

$datetime = "Thursday, April 18 at 7:30 pm";
$formats[] = "*# F d * g#i a+";