mysql日期显示30/11 / -000而不是0000-00-00

时间:2014-03-26 16:39:36

标签: php mysql date

我知道这已经被问到了,但我也找不到正确答案,因为我的问题有点不同。

我有一个用php编写的带有mysql的web应用程序。在过去的几年里,一切都运行良好,直到几天前我将应用程序移动到一个性能最佳的服务器,源和数据库。一切顺利,但不是在这个日期的情况下。

错误的日期保存在0000-00-00的mysql表中,但是当我显示它时显示为30/11/-000

如何摆脱这个?我仍然有旧的工作服务器,所以我可以检查mysql或PHP配置。我认为问题很简单,因为配置参数,但我找不到合适的参数。

这是用于检索日期的片段。这不是我的代码,也不能向原始开发者询问,你能解释一下为什么检查日期是否为30/11/1999?似乎谷歌说的一个常见问题,我认为是参与其中。

    function getDataF($data){

       if (($stadata = strtotime($data)) == -1 || $stadata === false) {
           return "";
       }

       $return = date("d/m/Y",$stadata);

       if ($return == "30/11/1999") return "";

       return $return;

}

3 个答案:

答案 0 :(得分:2)

当输入为30/11/1999时,

strtotime返回00-00-00 00:00:00Code Pad here。这解释了为什么开发人员检查日期是否为30/11/1999并在这种情况下返回空白。

关于为什么0000-00-00日期显示为31/11/-000:似乎strtotime函数中存在一个错误(或“特性”),它为某些PHP版本返回-0001年份({ {3}})。因此,对于无效日期,日期会生成31/11/-0001。我猜显示日期的代码会从最后删除一个字符,因为它预计年份为4位数。

答案 1 :(得分:0)

首先,在你的if陈述中没有任何内容停止脚本(假设你的意图是这样),所以无论什么$return,无论如何都会输出。

如果满足您的某个条件,您需要一些else语句或某些exit()die()函数来停止列车。

此外,您的第一个条件是在$stadata运算符之后调用变量||,然后再定义它。为什么你还需要这个额外的变量?只测试$data是否存在。另外,您需要进一步解析您的输入。

如果您以后不需要$stadata,请执行以下操作:

function getDataF($data){

   if (!$data) {
       return "";
   } 
   else
   {
    $return = date("d/m/Y", strtotime($data));

       if ($return == "30/11/1999") { 
        return "";
       } 
       else
       {
         return $return;
       }
   }
}

这是快速而肮脏的,不是最有效的写作方式,但会完成这项工作。

答案 2 :(得分:0)

您可能已经从32位服务器迁移到64位服务器。

strtotime仅在32位服务器上正常工作。手册说

Behavior of strtotime on 64 bit machines.

strtotime('0000-00-00 00:00:00')根据您的时区返回31/11/-000。 如果将代码移动到64位服务器并进行此检查,原始开发人员可能希望涵盖此案例。