PHP如何处理带时区的2021-07-09T14:09:47.529751-04:00时间并存入数据库
问题解答
1. 时间格式说明
你拿到的时间属于 ISO 8601 扩展格式,是国际通用的标准化时间表示规则。
- 格式拆解:
T为日期和时间的分隔标识,末尾的-04:00为时区偏移量,代表该时间比UTC(协调世界时)慢4小时。
2. 时区信息判断
该时间明确携带时区信息,通过后缀的-04:00偏移量标记所属时区,不存在时区歧义。
3. 数据库存储相关问题
是否可以直接存为datetime类型?
要看你使用的数据库类型:
- 若使用MySQL等数据库的默认
datetime类型:不能直接存储。默认datetime类型不支持保存时区信息,直接存入会丢弃末尾的-04:00偏移量,仅保留前面的时间字符串,等于丢失了时区上下文。 - 若使用支持带时区的时间类型(比如PostgreSQL的
timestamptz、MySQL 8.0+的datetime配合时区配置):可以直接存入,数据库会自动解析偏移量转换为内部统一时间存储。
服务器时区不一致直接存储会不会导致时间不准确?
如果存储的是不带时区的datetime类型,一定会出现时间偏差。你直接存储的是-04:00时区的当地时间,若服务器使用东八区等其他时区,后续读取时会默认把该时间识别为服务器本地时区的时间,最多可能出现十几个小时的偏差。
推荐存储方案:统一转换为UTC时间戳或者UTC时区的datetime字符串存入数据库,读取时再根据业务需要转换为对应时区的时间。
4. 代码正确性判断
你编写的这段PHP代码不完全正确:
echo date( "Y-m-d H:i:s", strtotime("2021-07-09T14:09:47.529751-04:00") );
存在的问题:strtotime函数会自动把传入的带时区的ISO时间转换为当前PHP配置时区对应的Unix时间戳,再用date格式化输出的是PHP配置时区对应的当地时间,既不是原时间的UTC时间,也没有保留原时区信息。
如果你需要转换为UTC时间存入数据库,可参考修正后的代码:
// 指定输出时区为UTC date_default_timezone_set('UTC'); echo date( "Y-m-d H:i:s", strtotime("2021-07-09T14:09:47.529751-04:00") ); // 输出结果为2021-07-09 18:09:47,对应UTC时间,存入数据库不会产生时区偏差
内容的提问来源于stack exchange,提问作者dds sddssd
相关产品推荐
相关产品推荐

