我在此处找到关于SO的答案之后,甚至在SO告诉我我的问题可能已经结束的情况下,我对此发表了乐观的看法。
考虑一个CSV文件,该列的列包含表示日期或时间或两者的字符串。我想在查看该列后才发现-完全是什么类型的列,而不仅仅是它是一个有效的“日期”?
PHP函数strtotime出色地完成了几乎所有日期时间字符串的unix时间戳返回工作。但是(今天当我在2018年10月8日发布此消息时),3:45PM
和15:45:00
和10/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';
}
答案 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进行繁重的工作很有意义)。但是,与其尝试解析数据,不如寻找特定的模式可能是更好的方法:是否有字母字符串? +或-?几位数?连续几位数?
您仍然应该从测试用例列表开始。