php日期格式插入错误的日期

时间:2011-07-26 10:27:28

标签: php mysql epoch

我很困惑为什么这段代码不会将英国格式00/00/0000的日期转换为mysql date format 0000-00-00。我在数据库中获得的是1970-01-01。它是在日期格式而不是日期时间,所以它应该工作?感谢

$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy); 
$destdate = date('Y-m-d', strtotime($desttempdate));

3 个答案:

答案 0 :(得分:3)

以下是您可以使用它的几个选项:

对于PHP4,这样的东西:

function date2timestamp($date,$seperator='/'){
    if($date!=''){
        $dateEx = explode($seperator,$date);
        $date = (strlen($dateEx[2])==2?'20'.$dateEx[2]:$dateEx[2]).'-'.$dateEx[1].'-'.$dateEx[0].' 00:00:00';
    }
    return $date;
}

对于PHP5.3,使用createFromFormat()

$date = DateTime::createFromFormat('j/M/Y', $UK_date);
echo $date->format('Y-m-d');

PHP5.2中createFromFormat()的其他选项还包括:

答案 1 :(得分:2)

strtotime()函数将返回Unix时间戳并且0000-00-00日期不适合 - 您只需将0(零)转换为{{1} }}

你可以通过这样做来做你想做的事情:

1970-01-01

答案 2 :(得分:1)

问题是你传递给strtotime它认为无效的日期。 The documentation说:

  

注意:

     

通过查看,可以消除m / d / y或d-m-y格式的日期   各个组件之间的分隔符:如果分隔符是a   斜线(/),然后是美国m / d / y;而如果   separator是短划线( - )或点(。),然后是欧洲d-m-y格式   假定。

     

为避免潜在的歧义,最好使用ISO 8601(YYYY-MM-DD)   date或DateTime :: createFromFormat()尽可能。

所以这里发生的是你使用/分隔符传递一个字符串,这意味着strtotime尝试将其解析为m/d/y而不是d/m/y。如果您的日期是欧洲格式,则要么根本不进行替换,要么更好地使用DateTime::createFromFormat()作为文档建议。

您可以通过检查strtotime

的返回值来检查确实存在这个问题
$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy);
var_dump(strtotime($desttempdate));

这将输出“bool(false)”,确认strtotime无法解析其输入。

<强>解决方案:

如上所述,首选DateTime::createFromFormat()

$date = DateTime::createFromFormat('d/m/Y', $_POST['destroy']);
$destdate = $date->format('Y-m-d');

否则,即使我不推荐这种方法,解决问题的最简单方法就是跳过str_replace

$destdate = date('Y-m-d', strtotime($_POST['destroy']));