2

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

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

3 回答 3

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() 的其他选项包括:

于 2011-07-26T10:29:41.670 回答
2

strtotime()函数将返回 Unix 时间戳并且0000-00-00日期不适合它 - 你只会得到0(零) ,它将被正确转换为1970-01-01.

您可以通过执行以下操作来做您想做的事情:

$destdate = mysql_real_escape_string($_POST['destroy']); // assuming YYYY/MM/DD
$destdate = str_replace('/', '-', $destdate);
if ($destdate != '0000-00-00'){
    $destdate = date('Y-m-d', strtotime($desttempdate));
}
于 2011-07-26T10:31:45.767 回答
1

问题是您传递给strtotime它认为无效的日期。文档说:

笔记:

m/d/y 或 dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 dmy 格式。

为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 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']));
于 2011-07-26T10:31:17.817 回答