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

4

我正在尝试解析特定格式的字符串,但惊讶地发现找不到一个好的函数来完成这个任务。

我唯一找到的是 strtotime,但它不能胜任,因为它会猜测日期格式。我真的不信任这个"猜测"部分。 此外,我的输入字符串采用法国格式(dd/mm/aaaa),似乎没有很好地被理解(它解析美国格式,如mm/dd/aaaa)。

我要找的是一个函数,它接受一个日期字符串和一个格式来解析。 我可以用正则表达式自己做,但我无法相信它不存在。

我找到了:

  • DateTime::createFromFormat()。但它只适用于PHP 5.3,我没有升级PHP版本的权限(5.2)
  • strptime()。这种方法做我想要的事情,但在Windows平台上没有实现(顺便说一下:WTF ??)

有什么建议吗?


2
也许你可以使用http://www.phpclasses.org/browse/package/4535.html。 - nikc.org
我确实不太相信“猜测”部分。但如果字符串已经格式化好了,那就没有什么不可信的了吧? - karim79
er - dd/mm/yyyy 是一种英国格式。mm/dd/yyyy 是一种美国格式。 - Waggers
3
我知道,但重新格式化输入字符串肯定很简单,而且比仅仅为此引入一个外部依赖要更好。 - karim79
1
顺带问一句,有人知道为什么在Windows上没有实现strptime()函数吗? - Julien N
我猜它实际上不是用PHP编写的,而只是调用了一个在Windows中没有实现的库函数。 - JW.
6个回答

4

4

不幸的是,似乎更好地完成这样的解析 需要手动操作, 通过在斜杠处分割字符串,然后切换日和月。


是的,将月份/日期翻转然后运行strtotime()并不难。 - Jeremy L
这只是为了“不重复造轮子”。但如果我解析它,strtotime就没用了,我更喜欢使用mktime()。 - Julien N
接受。因为虽然其他答案是正确的,但它们需要手动解析并使用strtotime(),而一旦字符串被解析,它似乎就变得毫无用处。 最佳解决方案似乎是使用正则表达式来解析字符串,然后使用mktime()获取Unix时间。 - Julien N

1

来自php.net关于strtotime的以下评论可能有所帮助:

对于日期顺序不确定的非美国日期(例如01/02/2003),无法正常解析。这将被解析为2月1日而不是1月2日。

如果你正在解析非美国日期,可以交换日期元素的位置以解决问题:

<?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)); 
?> 

警告:上述仅适用于日期,对于时间会出现错误:12:30:01 将被转换为 30/12/01。

1

我自己写了一个类,你可以在http://sourceforge.net/projects/phpdbedittk的gadmdatecommand.php中找到一个不错的版本。

关于这里的评论只需通过'/'分割并交换数字,事实并不是那么简单。如果您提供将日期输入到输入框中的选项,您可能会得到-取决于用户所在地区和应用程序

1/7/2010 1.7.2010 1-7-2010 15 Jul 1 Jul 2010 1/6/8

以及许多其他变体。我已经成功解决了这个问题(至少对我来说),方法是创建日期格式,每个日期格式都有:

a)匹配格式的正则表达式 b)将正则表达式括号映射到日期片段(日,月,分钟,上午/下午)的数组映射器 c)date()的输出格式

希望对你有所帮助。


0

strptime():
在内部,此函数调用系统的C库提供的strptime()函数。这个函数在不同操作系统上的行为可以()明显不同。建议在PHP 5.3.0及更高版本中使用不受这些问题影响的date_parse_from_format()
http://www.php.net/manual/en/function.strptime.php


0
如果您知道日期格式输入将是英文格式,则可以将其处理为更标准的日期格式。将24/7/2007简单解析为2007-07-24是微不足道的。使用正斜杠分割并将部分放在正确的位置。我知道strtotime可以正确解析2007-07-24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接