我很困惑为什么这段代码不会将英国格式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));
答案 0 :(得分:3)
以下是您可以使用它的几个选项:
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;
}
$date = DateTime::createFromFormat('j/M/Y', $UK_date);
echo $date->format('Y-m-d');
答案 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']));