一个值得尊敬的PHP Datetime解析器

时间:2008-12-18 11:58:23

标签: php datetime datetime-parsing

echo date('r',strtotime("16 Dec, 2010")); //Tue, 16 Dec 2008 20:10:00 +0530
echo date('r',strtotime("16 Dec  2010")); //Sat, 16 Jan 2010 00:00:00 +0530

这是错的......它应该失败或者应该正确解析。你知道php中任何健壮的自然语言日期/时间解析器吗?你如何在php中解析自然语言日期时间?

编辑:

var_dump(strtotime("16 Dec, abcd")); //bool(false)

“2010年12月16日”是有效的GNU日期输入格式,或者不是。在第一种情况下,它应该返回正确的答案,在第二种情况下它应该返回false。这就是我所说的“错误”。

编辑:

目的是跳跃猜测接受各种各样的用户输入。

5 个答案:

答案 0 :(得分:2)

如果您知道字符串中表示时间的格式,可以使用strptime()和相应的格式字符串来解析它。当它无法根据格式解释字符串时,它至少会报告错误。

此功能存在于PHP 5.1.0及更高版本中。

如果您想接受任意用户输入,您应该向用户提供清晰明确的反馈,以便她可以对错误解释的日期做些什么。大多数情况下,无论如何都不会出现问题,你无法捕捉到所有有问题的案例(想想美国与欧洲的格式)。

答案 1 :(得分:1)

这没有错,你提供的数据含糊不清 - 存在着天壤之别。

模糊数据意味着您可以合理地期望它是“最佳猜测”。你可能不同意它如何做出这个最好的猜测,但这不是'错',这只是对最有可能的看法。在不消除歧义的情况下,你不能指望更多。

进一步的想法,主要是对OP的评论:

无声失败不是一种选择 - 决定何时无声地失败会受到相同规则的约束,并且会被同样的歧义抛出。

哪个示例字符串是错误的,应该默默地失败?那个旁边的人怎么样?他认为同一个是错的吗?如果通过不并排比较来删除上下文会怎样?

这里唯一的'错误'就是期望一个函数能够从总是受到歧义的数据中解读一个确切的含义......这就是那些例子,我还没有得到约会:)(1/2/08是2月的第一个?还是1月2日?2008年?2008年?8?)

是的,那就是说,我要写一个名为'is_this_art'的函数......

答案 2 :(得分:1)

有一个名为Chronic的Ruby类,它具有处理方便用户输入所需的灵活性:http://chronic.rubyforge.org/

我确信你可以通过用PHP的DateTime替换Ruby的Time来将它移植到PHP。

答案 3 :(得分:0)

strtotime是你能找到的最好的功能。我怀疑日期的任意字符串表示将被100%正确解释,因为它至少需要一些关于所使用格式的信息。

换句话说:请定义自然语言(您在问题中使用了两个不同的版本,因为php解释器正确指出)

答案 4 :(得分:0)

我对任何人都不熟悉,但也许有人可以提供已经写好的。与此同时,我建议在通过strtotime之前通过正则表达式或其他重复数据运行您的日期数据,并在其输出上使用一点完整性检查以查看返回的日期是否落在可接受的范围内。