关于时间戳2038年1月19日之后日期的存问题

浏览:5693 发布日期:2018/09/18 分类:ThinkPHP5专区 关键字: php 时间戳 2038
首先

能确定的是php与linux版本都是64位,thinkphp为5版本

其次

在thinkphp中直接strtotime一个“2038-05-01 01:02:03”的时间戳可以正确的输出int型时间戳,也可使用date将时间戳转回为string时间
在mysql中,直接使用sql语句,可以更新超过2038年的int型,

问题来了

在tp中,将此时间戳存入数据库过程中,本地环境不报错,但是只要超过2038年1月19日的时间戳,数据库里直接为0。而如果把这句sql使用fetchSql转为语句,然后将语句复制到sqlyog等数据库管理工具里,可以成功执行,或者说直接使用Db::execute($sqlStr);这样也是能更新数据没有问题
经过各种尝试,不管model还是db还是Db,只要是连贯操作就不行,只能使用Db执行原生sql,就可以。

我该如何解决这个问题呢?

贴出代码$str = '2038-05-01 01:02:03';
$time = strtotime($str);
$res = db('UserAddress')->where('id',13987)->setField('id_card_validity',$time);
以上代码执行后,$res=0; 该字段为int 无符号10位,字段值为0

使用fetchSql(true)后打印出来的sql语句
“UPDATE `zy_user_address` SET `id_card_validity`=2156259723 WHERE `id` = 13987”
复制到sqlyog等数据库管理软件里执行没有问题
或者$res = db('UserAddress')->where('id',13987)->fetchSql(true)->setField('id_card_validity',$time);
Db::execute($res);
执行 也是没有问题的

【解决方案】
因为int类型最大值为2147483647 转换为日期是:2038/1/19 11:14:7
所以以超过这个日期转为int时间戳的,int为变量写入数据库,在某一步会校验超过了int的范围,于是我在int时间戳写入库之前用strval转为字符,则写入成功。
最佳答案
评论( 相关
后面还有条评论,点击查看>>