我正在根据用户输入的日期,月份和年份值构建时间戳。
假设用户输入了一些错误的值并且日期是“31-02-2012”,这是不存在的,那么我必须得到错误的回报。但在这里它将它转换到附近的另一个日期。准确地说:“02-03-2012”..
我不希望这发生..
$str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012
有人可以帮忙吗?如果日期不是原始日期,我不希望返回时间戳。
答案 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进行检查。