2011-10-04 71 views
3

如何检查变量$date是否包含2011-09-20形式的日期?这是为了知道$date是否包含任何字母,因为我想使用date()并给出错误。如何检查变量是否包含日期或日期和文本?

+0

你为什么要限制自己的格式“2011-09-20”? '20-09-2011'有什么问题?来自美国以外的国家,我可以告诉你,因为我使用的日期格式不是美国使用的格式,所以出现错误非常令人沮丧。 strtotime()接受所有的日期格式,请不要毁掉你的软件;) –

+0

我也在美国以外。但是我使用的产品来自美国。 – EnexoOnoma

+0

我添加一个演示:http://stackoverflow.com/questions/7645094/how-to-check-if-a-variable-contains-a-date-or-a-date-and-text/7645146#7645146 – JellyBelly

回答

11

试试这个:

$date = '2011-09-20'; 
list($y, $m, $d) = explode("-", $date); 
if(checkdate($m, $d, $y)){ 
    echo "OK Date"; 
} else { 
    echo "BAD Date"; 
} 

演示在这里:http://codepad.org/3iqrQrey

+0

当试图解析带有字符串内容的变量时,建议避免非正确的错误: 'if(is_numeric($ y)&& is_numeric($ m)&& is_numeric($ d)&& checkdate($ m,$ d, $ y)){' – ldmuniz

0

也许它帮助,如果你尝试is_numeric()结合的str_replace()方法,像这样:

<?php 
    $isValid = is_numeric(str_replace('-', '', $myDateToCheck)); 
?> 

当然,这并没有说明日期的格式,而是显示变量是否包含任何非数字字符。

如果上述示例返回true,则可能需要使用checkdate()方法来进一步调查变量。

5

尽管它并不完美,

if (false === strtotime($date)) { 
    echo 'invalid date'; 
else { 
    echo 'valid date'; 
} 
+0

为什么?它出什么问题了?我认为这是完美的方式,允许所有可能的日期格式。 –

+1

好吧,strtotime('now')会返回一个时间戳,这不是OP想要的 – Alfwed

0

可以使用正则表达式(^[1-9]{4}-[1-9]{2}-[1-9]{2}$)与preg_match这一点。

另一种方法是strptime,它用于将字符串(与某种格式相关联)转换为时间。

1

这不是exatly你要求什么(也接受其他日期格式),但将有助于找出日期是否有效:
strtotime($date)将返回FALSE如果$date具有无效的日期格式。
Manual

0

SOLUTION 1

结合什么@Alfwed和@JellyBelly中写道,这里是我是如何做的:

public function valid_date($inputdate){ 
    $date = $inputdate; 
    if (strtotime($date)){ 
     if (strpos($date,'/') !== false) { 
     list($day, $month, $year) = explode('/', $date); 
     return checkdate($month, $day, $year); 
     }else{ 
      return false; 
     } 
    }else{ 
     return false; 
    } 
} 

它会检查羯羊如果输入文本(例如:“ adasdsad“),或者它是否具有日期格式(例如:”10/02/1988“),并检查它是否是有效日期。

如果输入日期是10-10-1996也是有效格式或10.02.1996,它将不会接受它们,因为我要求用户使用带“/”的格式。只要删除,如果你不想做这个验证,就是这样。

解决方案2

我发现,解决方案1,如果你打算进入一个将来的日期不起作用。所以我不得不寻找另一种解决方案。那就是:

public function valid_date($date, $format = 'd/m/Y'){ 
     $d = DateTime::createFromFormat($format, $date); 
     return $d && $d->format($format) == $date; 
} 

这不是我的,发现它在:link

相关问题