PHP:比strotime更好的日期解析器

PHP:比strotime更好的日期解析器,php,Php,我试图用一种特定的格式解析字符串,我很惊讶地发现我找不到一个好的函数来做这件事 我找到的唯一一个是strotime,它不适合猜测日期格式。我真的不相信“猜测”部分。 此外,我的字符串输入是法语格式(dd/mm/aaaa),这似乎不是很好理解(它解析美国格式,如mm/dd/aaaa) 我要找的是一个函数,它接收输入的日期字符串和要解析的格式。 我可以用regexp自己做,但我不敢相信它已经不存在了 我发现: 。但它只适用于PHP5.3,我没有能力升级PHP版本(5.2) 。此方法符合我的要求,但

我试图用一种特定的格式解析字符串,我很惊讶地发现我找不到一个好的函数来做这件事

我找到的唯一一个是strotime,它不适合猜测日期格式。我真的不相信“猜测”部分。 此外,我的字符串输入是法语格式(dd/mm/aaaa),这似乎不是很好理解(它解析美国格式,如mm/dd/aaaa)

我要找的是一个函数,它接收输入的日期字符串和要解析的格式。 我可以用regexp自己做,但我不敢相信它已经不存在了

我发现:

  • 。但它只适用于PHP5.3,我没有能力升级PHP版本(5.2)
  • 。此方法符合我的要求,但未在windows平台上实现(顺便说一下:WTF??)

有什么建议吗?

不幸的是,这样的解析似乎做得更好,方法是在斜杠处分解字符串,然后切换日期和月份。

签出,这样可以在设置日期时指定格式。除了包括在内,你也可以


php.net在strotime上的以下评论可能会有所帮助:

在以下情况下,非美国日期失败: 订购是不确定的,例如 2003年2月1日-解析为2月1日, 而不是1月2日

如果您正在分析非美国客户的日期 在区域设置中,可以翻转 你的约会对象:


警告:以上仅适用于日期, 休息时间:12:30:01 转换为2001年12月30日


如果您知道您的日期格式输入将是英语格式的,那么您可以将其处理为更标准的日期格式。将
24/7/2007
简单解析为
2007-07-24
并不重要。用正斜杠爆炸,把零件放在正确的位置。我知道,
strotime
将正确解析
2007-07-24

我自己编写了一个类,我想您会在中的gadmdatecommand.php中找到一个好的版本

关于这里的注释只是以“/”爆炸并交换数字,这并不是那么简单。如果您愿意在输入框中输入日期,您可能会得到-这取决于用户和应用程序的位置

1/7/2010 1.7.2010 1-7-2010 7月15日 2010年7月1日 1/6/8

还有更多的变化。我通过创建DateFormat解决了这个问题(至少对我来说是成功的),每个DateFormat都有 a) 与格式匹配的正则表达式 b) 将正则表达式括号匹配为日期段(日、月、分钟、上午/下午)的数组映射器 c) 日期()的输出格式

HTH

strtime():

在内部,此函数调用系统的C库提供的strtime()函数。此函数可以在不同的操作系统中表现出明显不同的行为()。PHP 5.3.0及更高版本建议使用
date\u parse\u from_format()
,它不会出现这些问题

也许你可以使用“我真的不相信“猜测”部分。”但是如果字符串已经被特别格式化,那么什么是不可信的呢?er-dd/mm/yyyy是一种英文格式。mm/dd/yyyy是一种美国格式,我知道,但是重新设置输入字符串的格式肯定很简单,而且比仅仅为此使用外部依赖要好。附带问题。。。有人知道为什么strtime()没有在windows上实现吗?是的,翻转月份/日期然后运行strtime()一点也不困难。这只是为了“不重新发明轮子”。但是如果我解析它,strotime是无用的,我更喜欢使用mktime()。Accepted。因为虽然其他答案都是正确的,但它们会手动解析并使用strotime(),而一旦解析完字符串,它似乎就毫无用处了。最好的解决方案似乎是使用正则表达式解析字符串,然后使用mktime()获取unix时间。
$date = new Zend_Date();
$date->set('27/08/2009','DD/MM/YYYY');
<?php 
$y = $_POST['date']; 
if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $y, $match)) { 
  $y = $match[2] . '/' . $match[1] . '/' . $match[3]; 
} 
echo date('d # m # Y', strtotime($y)); 
?>