strtotime()将不存在的日期转换为另一个日期

时间:2011-09-28 12:56:14

标签: php function date strtotime

我正在根据用户输入的日期,月份和年份值构建时间戳。

假设用户输入了一些错误的值并且日期是“31-02-2012”,这是不存在的,那么我必须得到错误的回报。但在这里它将它转换到附近的另一个日期。准确地说:“02-03-2012”..

我不希望这发生..

$str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012

有人可以帮忙吗?如果日期不是原始日期,我不希望返回时间戳。

6 个答案:

答案 0 :(得分:4)

您可以查看checkdate

答案 1 :(得分:2)

这是因为strtotime()-时遇到了麻烦,因为它们用于表示-1 week等短语......

尝试

$str = '31-02-2012';
echo date('d-m-Y', strtotime(str_replace('-', '/', $str)));

但是 31-02-2012不是有效的英文格式,应为02-31-2012


如果你有 PHP> = 5.3 ,你可以使用createFromFormat

$str = '31-02-2012';
$d = DateTime::createFromFormat('d-m-Y', $str);
echo $d->format('d-m-Y');

答案 2 :(得分:1)

在使用strtotime之前,您必须检查日期是否可行。 Strtotime会将其转换为unix日期,这意味着它将使用秒数......这意味着它将永远是一个日期。

答案 3 :(得分:1)

您可以解决此问题

<?php
$str = "31-02-2012";
$unix = strtotime($str); 
echo date('d-m-Y', $unix);
if (date('d-m-Y', $unix) != $str){
   echo "wrong";
}
else{
   echo date("d-m-Y", $unx);
}

或只使用checkdate()

答案 4 :(得分:1)

使用checkdate功能。

$str = "31-02-2012";
$years = explode("-", $str);
$valid_date = checkdate($years[1], $years[0], $years[2]);

Checkdate Function - PHP Manual&amp; Explode Function - PHP Manual

答案 5 :(得分:1)

结合date_parse和checkdate来检查它是否是有效时间。

<?php
date_default_timezone_set('America/Chicago');

function is_valid_date($str) {
    $date = date_parse($str);
    return checkdate($date['month'], $date['day'], $date['year']);
}

print is_valid_date('31-02-2012') ? 'Yes' : 'No';
print "\n";
print is_valid_date('28-02-2012') ? 'Yes' : 'No';
print "\n";

即使根据PHP date formats可以接受该日期格式,它仍可能导致日期解析器出现问题,因为它很容易混淆月份和日期。例如,02-03-2012,很难判断02是月份还是日期。最好在这里使用其他更具体的日期解析器示例来首先解析日期,然后使用checkdate进行检查。