php / mysql:strToTime错误操作日期

时间:2015-11-20 12:52:36

标签: php mysql strtotime

我有一些代码用于渲染几年来运行良好的日期,现在已经破了。我不知道它是否与我的主机更改版本的PHP有关,或者某种程度上是错误悄悄进入。

基本上,11/30/15等日期现在呈现为11/30/-1

这是一个正在发生的事情的例子:

$olddate = $row['date'];//in database this looks like:0000-00-00 00:00:00
$newdate = nicedate($olddate);
echo "starting date time: ".$olddate;//displays as 'starting date time: 0000-00-00 00:00:00'
echo "after transforming it with nice date: ".$newdate; //displays as 'after transforming it with nice date: 11/30/-1'

我也尝试过运行strtotime并得到这个:

echo "after transforming it with strtotime: ".nicedate($row['starttime']);//-62169966000

    // gets nice data
    function nicedate($datetime) {
    $niceDate = strtotime($datetime);
    $niceDate = date("m/d/y",$niceDate);
    return $niceDate;
    }

1 个答案:

答案 0 :(得分:0)

正如您在此处看到的https://3v4l.org/8gqCK,这实际上取决于您使用的是哪个PHP版本。

PHP会将字符串0000-00-00 00:00:00呈现给-0001-11-30 00:00:00.000000

这是DateTime的示例输出:

object(DateTime)#1 (3) {
  ["date"]=>
  string(27) "-0001-11-30 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

OUTPUT还取决于时区:

object(DateTime)#1 (3) {
  ["date"]=>
  string(27) "-0001-11-29 23:06:32.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

这将输出:

  

...好日期:11/29 / -1

此处strtotime()

int(-62169987208)

所以你看到日期函数在不同版本上被更改了,你现在可以做的只是检查日期是0000-00-00 00:00:00

function nicedate ( $datetime ) {
    if( $datetime == "0000-00-00 00:00:00" ) return "Some value or false?";
    ...
    ...
}

您还可以查看 MySQL 模式:NO_ZERO_IN_DATE

由于以下评论而更新了方法:

function nicedate( $datetime ) {
    if( !validateDate( $datetime ) ) return "something";
    $dateTimeObject = DateTime::createFromFormat('Y-m-d H:i:s', $datetime );
    return $dateTimeObject->format( "m/d/y" );
}

function validateDate($date) {
    $d = DateTime::createFromFormat('Y-m-d H:i:s', $date);
    return $d && $d->format('Y-m-d H:i:s') == $date;
}

函数已从此answerphp.net

复制

这是因为0000-00-00....不是有效日期。发生的事情很简单,从年,月,日开始......总是从最后一个减去一(1)个。

0000 -1 = -1// year
00 - 1 = 11// month, because 12 is the highest value that datetime recognizes as month
00 - 1 = 30// day, because 31 is the highest value that datetime recognizes as day

小时,分钟,秒,......没关系,因为零是时间的有效值。

这就是为什么它呈现的原因:-0001-11-30 00:00:00.000000