PHP区分仅日期或仅时间以及两者

时间:2018-10-08 11:05:05

标签: php strtotime

我在此处找到关于SO的答案之后,甚至在SO告诉我我的问题可能已经结束的情况下,我对此发表了乐观的看法。

考虑一个CSV文件,该列的列包含表示日期或时间或两者的字符串。我想在查看该列后才发现-完全是什么类型的列,而不仅仅是它是一个有效的“日期”?

PHP函数strtotime出色地完成了几乎所有日期时间字符串的unix时间戳返回工作。但是(今天当我在2018年10月8日发布此消息时),3:45PM15:45:0010/8/2018 3:45PM都将返回相同的Unix时间,尽管显然前两个是时间。

确定字符串严格是日期成分,时间成分还是两者的方法是什么?

PS 如果我必须自己编写一个函数,那么到目前为止,最好的选择是在字符串中寻找一个:,这意味着存在时间成分(这意味着时间或日期时间)。如果将其解析为日期时间,但不存在:,那么我们可以假设它只是一个日期。但是,我再次想知道PHP是否具有更优雅的方式。这是一个“很好”的解决方案:

P.P.S 该功能实际上是一个“非常好”的解决方案,这要归功于@KarstenKoop在有关strtotime的第二个参数的注释中的巧妙建议:

function date_time_component($date){
    if(strtotime($date) === false) return false;
    if(strtotime($date, 86400) !== strtotime($date, 86400 * 2)) return 'time';
    if(strstr($date, ':')) return 'datetime';
    return 'date';
}

1 个答案:

答案 0 :(得分:0)

您应该开始,编写一组测试用例-您可以将其包含在问题中。有许多种写日期的方式和几种写时间的方式。

以下是一些入门指南:

日期

 2018-10-08
 08/10/2018
 10/08/2018
 08-10-2018
 10-08-2018
 10-Oct-2018
 20181008
 10 Oct 2018
 10th October 2018
 October, 10th 2018

 1121
 11:21
 11:21 AM
 11:21
 11:21:46
 11:21:46 AM

时区

 +00:00
 +0
 +0000
 Europe/London

然后,您将拥有这三个组件的所有可能组合:

date
date time
date time timezone
time
time timezone
time date
time timezone date

这提供了400种不同的格式(并非所有格式都是唯一可解析的)。

(使用strtotime进行繁重的工作很有意义)。但是,与其尝试解析数据,不如寻找特定的模式可能是更好的方法:是否有字母字符串? +或-?几位数?连续几位数?

您仍然应该从测试用例列表开始。