欢迎光临
我们一直在努力

彻底解决ThinkPHP5 获取时间自动转化BUG

如果嫌文章太啰嗦,直接看最后一行。

Tp5获取时间时会自动进行转换,官方或者网上说的设置datetime_format值为false关闭自动转换输出,依然无效。

今天又遇到了这个问题,现记录下来:TP5对一段代码传递时间参数,出现异常。由于代码在普通情况下无法进行复现,现只能描述,TP5线上业务系统,用了大概下面代码:(线上是浏览器传参,以下代码只是示意)

<?php

function forTime($time){
    $myTimestamp = strtotime($time) !== false ? strtotime($time) : $time;
    echo "\r\n输出:\r\n".$myTimestamp."\r\n";
    $my_time = date('Y-m-d H:i:s', $myTimestamp);

    echo $my_time."\r\n";
}
forTime("2020-09-18 2:23:19");
forTime("2020-09-18 2:23:20");

执行第一个日期时输出正常,

但第二次执行(tp5系统不一定能复现):只要输入时间大于等于2020-09-18 2:23:20时(年全变成了7000-09-19 ****)

经过半天检查,原来是tp5把传入的时间转成了时间戳。于是加了一行代码输出strtotime($time) !== false的值

<?php

function forTime($time){
    echo "\r\n可否转为时间戳:". (strtotime($time) !== false);
    $myTimestamp = strtotime($time) !== false ? strtotime($time) : $time;
    echo "\r\n输出:\r\n".$myTimestamp."\r\n";
    $my_time = date('Y-m-d H:i:s', $myTimestamp);
 
    echo $my_time."\r\n";
}
forTime("2020-09-18 2:23:19"); // 可否转为时间戳:1
forTime("2020-09-18 2:23:20"); // 可否转为时间戳:1
forTime("1600367999"); // 可否转为时间戳:1
forTime("1600367000"); // 可否转为时间戳:1

但发现4个输出值都为1,因此通过下述代码无法判断输入的时日期还是时间戳。

$myTimestamp = strtotime($time) !== false ? strtotime($time) : $time; // 此行代码错误

上段代码是网上抄来的,今天才验证到是错的。但奇葩的是:传入小于等于2020-09-18 2:23:19的日期正常,传入大于等于2020-09-18 2:23:20的日期是错误的。

于是更改了入参时间的判断方式,即在转换时间戳时进行如下判断:

$myTimestamp = is_numeric($time) ? $time : strtotime($time);

好了,啰嗦了一堆,最后:

解决方案:

tp5获取时间时会自动进行转换,设置datetime_format值为false关闭自动转换输出起不到效果。

要彻底解决这个问题,需要对传入的时间是否被转换为时间戳。

$time = is_numeric($time) ? $time : strtotime($time);

赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » 彻底解决ThinkPHP5 获取时间自动转化BUG

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址