Ser*_*tro 4 php validation date date-formatting leading-zero
我需要在 php 中验证精确的日期格式。
在我的情况下,最佳日期格式应该是:例如1/1/2017
(没有前导零)并且代码应该允许我避免日期格式的其余部分。
以下代码是我写的,但没有结果:
if(preg_match("/([1-9]|[1-2][0-9]|3[0-1]-([1-9]|1[0-2])-^[0-9]{4})$/", $date){
// insert into etc. etc....
}else{
// update etc. etc....
}
Run Code Online (Sandbox Code Playgroud)
问题是代码没有正确验证日期;它接受各种日期格式。
我注意到OP提交的答案不是万无一失的,所以我开始研究问题下评论中提到的一些功能和我自己的一些想法。
我同意 apokryfos 的观点,即使用正则表达式来验证日期表达式不是最佳实践。一个纯粹的正则表达式解决方案将是一个越来越冗长和越来越难以理解的模式,因为它必须考虑过去和未来的闰年。为此,我研究了 php 提供的一些日期函数。
format
参数遵守DateTime::createFromFormat()的语法/规则:看看d
和j
是如何组合在一起的,就像m
和 一样n
。因此,此函数将捕获无效日期,但不会捕获不需要的前导零。
strptime()由 Casimir et Hippolyte 建议。此函数使用 提供不带前导零的匹配天数%e
。此函数没有匹配非零前导月份数字的字符。此外,此功能可能会因操作系统而出现问题。
check_date()似乎是一个合乎逻辑的选择,但它同样不会在零主导数字上退缩。此外,这个函数需要比其他函数更多的数据准备,因为它需要个性化月、日和年的值。
if(!DateTime::createFromFormat('j/n/Y', $date))
在这种情况下,由 deceze 建议的稍微不同的场景将不起作用。createFromFormat() 会不遗余力地构造一个有效的日期——即使是像这样的字符串99/99/9999
也能通过。
为了创建最简洁的表达式,以下是我可以使用 DateTime 类提供的看似万无一失的解决方案:
if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){
// valid
}else{
// invalid
}
Run Code Online (Sandbox Code Playgroud)
strtotime()
对于这种情况,可以与单个条件一起使用,因为 OP 的日期格式使用斜杠作为分隔符,并且此函数将正确解析日期表达式“美式风格”。这似乎是检查没有前导零的有效日期的最简单方法:演示链接
Run Code Online (Sandbox Code Playgroud)if(date('n/j/Y',strtotime($date))==$date){ // valid }else{ // invalid }
如果您正在处理日期时间表达式并且不想检查时间部分,您可以在条件行之前调用此行:
$date = explode(' ', $date)[0]; // create an array of two elements: date and time, then only access date
Run Code Online (Sandbox Code Playgroud)
或者
$date = strstr($date, ' ', true); // extract substring prior to first space
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11072 次 |
最近记录: |