因项目需要从要集成阿里云STS的服务端SDK,从阿里云官网下载地址为:
解压后服务代码中有下面两行代码:
sts-server/aliyun-php-sdk-core/RpcAcsRequest.php中的45行:
date_default_timezone_set("GMT");
和sts-server/aliyun-php-sdk-core/RoaAcsRequest.php中的82行:
date_default_timezone_set("GMT");
如果在hyperf等类似基于swoole的框架中调用了STS的服务端SDK,会把整个项目的时间设置为GMT的,比如在hyperf框架下的bin/hyperf.php中,有这么一行代码:
date_default_timezone_set('Asia/Shanghai');
阿里云STS中的这两行设置时区的会覆盖bin/hyperf.php中设置时区的,导致整个项目中的时间不对,间隔导致了往数据库中表created_at这类的时间也不对,所以一是阿里云服务端STS的SDK太坑爹;二是在hyperf这类框架中有新集成第三方SDK时一定要手动搜索下有无设置时区的,如类似的date_default_timezone_set,一定要检查仔细了。
最后修复的方法为(以服务器时间为东八区为例):
//date_default_timezone_set('GMT');
$apiParams["Timestamp"] = date($this->dateTimeFormat, time() - 8 * 3600);
$this->headers["Date"] = date($this->dateTimeFormat, time() - 8 * 3600);