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