我在SO上搜索答案后乐观地发布了这个,即使SO告诉我我的问题可能会被关闭,我认为在这种情况下这是一个有效的问题.
考虑一个CSV文件,其中包含表示日期,时间或两者的字符串的列.我想在查看专栏后找出答案 – 这究竟是什么类型的专栏,而不仅仅是它是一个有效的“日期”?
PHP函数strtotime为几乎任何日期时间字符串返回一个unix时间戳做了一个了不起的工作.但是(今天我发布于10/8/2018),下午3:45和15:45:00以及10/8/2018 3:45 PM都将返回相同的unix时间,但显然前两个是时间.
确定字符串是严格的日期组件,时间组件还是两者兼而有之的方法是什么?
附:如果我必须自己编写一个函数,到目前为止最好的方法是在字符串中查找:这意味着有一个时间组件(意思是时间或日期时间).如果它解析为日期时间,但没有:存在,那么我们可以假设它只是一个日期.但同样,我想知道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';
}
解决方法:
您应该首先编写一组测试用例 – 您可以将其包含在您的问题中.有很多不同的方法来写日期和几种写时间的方法.
这里有一些让你入门:
日期
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
然后,您拥有3个组件的所有可能组合:
date
date time
date time timezone
time
time timezone
time date
time timezone date
这提供了400种不同的格式(并非所有格式都是唯一可解析的格式).
(使用strtotime进行繁重的开始很有意义).但是,不是试图解析数据,而是寻找特定模式可能是一种更好的方法:是否有字母串? a或 – ?多少位数?连续多少位?
您仍应该从测试用例列表开始.