php strtotime 不同版本1900年部分地区返回不同值

作者:zarte    发布时间: 2020-07-21

phpstrtotime

## 起因 最近做的项目需要从excel导入数据,时间格式的数据获取到的值是int类型。通过搜索了解到excel时间是从1900-1-1开始的天数,故想将日期字符串转为时间戳后加上导入的天数再转为日期字符串。上线后却发现导入的日期多了一天! ## 寻找问题 经过排查确认线上的strtotime后的时间戳与本地环境的不一致,代码如下: ``` $sbegintime = strtotime('1900-01-01 00:00:00'); var_dump($sbegintime); ``` 本地:-2209017600 线上:-2209017943 两者差了343s 由于两个环境都是php7的,猜想可能是时区问题,经过修改。 ``` date_default_timezone_set('PRC'); $sbegintime = strtotime('1900-01-01 00:00:00'); echo date("Y-m-d H:i:s", $sbegintime); var_dump($sbegintime); ``` 结果还是一样的,同时date()返回的时间字符串结果是一致的。 既然不是时区问题难道是系统问题?推荐个站点[https://3v4l.org/]( https://3v4l.org/)可以同时测试多个php版本并显示结果不同的版本。 将上面的代码执行后就发现问题所在了,php7.3.2开始返回的值少了343! ## 分析 从php的更新日志可以找到关于timelib的更新记录 >Upgraded timelib to 2017.08. >Updated timelib to 2018.02. 以及在1927年上海时区“went back 5 minutes and 52 seconds”时间发生过改变。使用其他时区测试发现存在部分时区与上海时区一样,另外的时区则正常。 不过352 变为 343仍待考证。

上一篇:  .net2.0项目发布失败未能加载文件或程序集BLL.XmlSerializers

下一篇:  git提交异常HTTP 401 curl 22 The requested URL returned error: 401

加载更多