PHP区分只有日期或唯一时间以及两者

我在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或 – ?多少位数?连续多少位?

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...