当给出含糊不清的$ time时,如何强制strtotime()返回日期而不是时间?

时间:2012-02-05 21:36:53

标签: php strtotime

好的回忆!

echo date('r', strtotime('10.01.11'));

版画: Sun,2012年2月5日 10:01:11

预计:星期一,2011年1月10日00:00:00

如何强制strtotime()仅将输入字符串解析为日期?我必须以不同的格式转换一堆日期。 DateTime::format不是一个选项,因为我不知道脚本会遇到的所有格式,甚至没有安装在服务器上(我没有权限这样做)。

试过
strtotime('day 10.01.11')
strtotime('10.01.11 00:00:00')
strtotime('10.01.11 midnight')
- 没什么用。

非常感谢任何帮助

5 个答案:

答案 0 :(得分:2)

  

如何强制strtotime()将输入字符串解析为仅日期?

你没有。 strtotime使用very well-defined parsing formats。它产生的东西将完全取决于你给它的东西。

'10.01.11'被解析为a time format,因为总是解释由句点分隔的三对数字作为时间。它将识别日期when separated by dashes, slashes or spaces。令人讨厌的是,在日期格式页面上有一个使用点的示例,但似乎没有一种确定的方法来强制日期解析而不是时间解析。叹了口气,PHP。

如果您需要将特定格式解释为日期而不是时间,则有两种选择。

首先,您可以使用不同的日期解析方法。如果预期的格式永远不会改变,您可以使用DateTime::createFromFormat()或可怕的strptime。您已经在评论中指出格式会有所不同,并且您的PHP版本已经足够大,不会有DateTime,所以这可能不适合您。

其次,您可以预处理数据。至少在此示例中,./的转换可能会有所帮助,但10/01/11可能会模糊不清地作为人类的约会。一个小的正则表达式嗅探确定如何最好地处理数据没有错。

还有第三种选择:如果您从用户那里获得此信息,请让您的应用程序开始强制用户以正常,一致,可解析的格式输入日期。训练您的用户使用YYYY-MM-DD可能需要一些时间,但这可能是最合理的长期赌注。

答案 1 :(得分:1)

为什么不默认将时间设置为00:00:00? e.g。

echo date('D, d M Y H:i:s', strtotime('10.01.11'));

strtotime也使用美国日期格式,所以这将被翻译成2011年10月1日。使用iso日期格式更容易

答案 2 :(得分:1)

经测试,这可行:

$date = DateTime::createFromFormat('d.m.y', '10.01.11');
echo $date->format('r');

http://codepad.viper-7.com/OH7Kyn

答案 3 :(得分:1)

为您修改输入选项吗?

$str = '10.01.11';
$str = str_replace('.', '/', $str);

echo date('r', strtotime($str));

但是,根据MM.DD.YY模式(美国标准),这仍然会输出Sat, 01 Oct 2011 00:00:00


编辑:根据您的使用情况,您可以考虑创建一个正则表达式模式列表并相应地解析日期。很难让这样的代码对所有的可能性开放。

答案 4 :(得分:0)

我不认为strtotime知道如何解析这些日期。为避免潜在的歧义,最好使用ISO 8601(YYYY-MM-DD)日期。