【问题标题】:php date format inserting wrong datephp日期格式插入错误的日期
【发布时间】:2011-10-13 07:20:06
【问题描述】:

我很困惑为什么这段代码不能将英国格式 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));

【问题讨论】:

  • MySQL 的默认日期格式与 PHP 不同。

标签: php mysql epoch


【解决方案1】:

这里有几个选项供您使用:

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

【讨论】:

  • 他可以通过date 电话重新排序日期。问题是 strtotime 返回一个错误的值。
【解决方案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));
}

【讨论】:

    【解决方案3】:

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

    注意:

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

    为避免潜在的歧义,最好使用 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']));
    

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多