Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP区分仅日期和仅时间以及两者_Php_Strtotime - Fatal编程技术网

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

PHP区分仅日期和仅时间以及两者,php,strtotime,Php,Strtotime,在这里搜索答案之后,我乐观地发布了这篇文章,即使SO告诉我我的问题可能已经结束,因为我认为在这种情况下,这是一个有效的问题 考虑一个CSV文件,其中的列包含表示日期或时间的字符串,或同时表示日期和时间。我想在看了这个专栏之后,找出-到底是什么类型的专栏,而不仅仅是它是一个有效的“日期” PHP函数在为几乎任何日期时间字符串返回unix时间戳方面做得非常出色。但是(今天,当我在2018年8月10日发布这篇文章时),3:45PM和15:45:00和10/8/2018 3:45PM都将返回相同的uni

在这里搜索答案之后,我乐观地发布了这篇文章,即使SO告诉我我的问题可能已经结束,因为我认为在这种情况下,这是一个有效的问题

考虑一个CSV文件,其中的列包含表示日期或时间的字符串,或同时表示日期和时间。我想在看了这个专栏之后,找出-到底是什么类型的专栏,而不仅仅是它是一个有效的“日期”

PHP函数在为几乎任何日期时间字符串返回unix时间戳方面做得非常出色。但是(今天,当我在2018年8月10日发布这篇文章时),
3:45PM
15:45:00
10/8/2018 3:45PM
都将返回相同的unix时间,尽管前两个显然是时间

确定字符串是严格意义上的日期组件、时间组件还是两者兼而有之的方法是什么

p.S.如果我必须自己编写一个函数,到目前为止最好的方法是在字符串中查找
,这意味着有一个时间组件(表示时间或日期时间)。如果它解析为日期时间,但不存在
,那么我们可以假定它只是一个日期。但我还是想知道PHP是否有更优雅的方式。以下是一个“相当好”的解决方案:

p.p.S由于@KarstenKoop在对
strotime
的第二个参数的评论中提出了巧妙的建议,该函数现在实际上是一个“非常好”的解决方案:

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

 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
时区

 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种不同的格式(并非所有格式都是唯一可解析的)

(使用strotime完成繁重的工作开始变得很有意义)。但与其试图解析数据,寻找特定模式可能是更好的方法:是否有字母串?a+还是-?多少位数?有多少个连续数字


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

CSV中的表示格式是什么?时间和日期是否遵守某些你可以依赖的规则?让我们说不。这样做的全部目的是确定专栏的意图,在格式上有很大的自由度-例如3:15,或3:15,甚至“中午”-但要知道专栏只是一个时间或仅是一个日期..让我看看我对你的理解是否正确;是否要验证日期/时间戳以检查其格式是否有效?否。假设它有效,我想确定它是仅时间、仅日期还是日期时间(两者)。请参阅我在问题“P.S.”之后添加的函数示例。您可以将时间戳作为第二个可选参数传递给
strotime()
,以进行相对计算。因此,如果您的输入仅包含一个时间,则日期将取自传递的值,您可以尝试使用两个不同的值并比较结果。如果两者相同,则日期取自输入,如果两者不同,则输入中没有日期(或相对日期,如“上周四”)。请参阅我在文章中开发的函数,并提供一些帮助。这将适用于绝大多数情况。时间的确定在您的提案中的DST更改方面存在缺陷。