华子的笔记 Help

Magento开发中的时间处理

Magento 初始化中设置了date_default_timezone_set('UTC’); ,请不要用使用date_default_timezone_set来配置时区。

Magento 操作数据库链接时初始化了SET time_zone = '+00:00' ,强制使用UTC时区作为会话时区,影响timestamp类型。

timestamp列的值在入库时从会话时区转换为UTC,在查询时从UTC转换为会话时区,实际就是timestamp类型保存和取出都是UTC时间。

MySQL

  • 对于常用的timestampMagento的UTC时区意味着Magento的时间入库和出库都是UTC时间

  • 如果是客户端直连数据库查看timestamp会自动转换成本地时间,会跟Magento获取的值差8个小时,datetime原样保存和取出。

Magento中保存和获取时间

  • datetime类型的时间 确认保存的是本地时间还是UTC时间,然后进一步处理

  • timestamp类型的时间 需要确保保存的是utc时间,取出时统一处理替换成本地时间

  • 后台表单等字段系统会有相关设置简化操作,自动转化

UTC时间如何转化成本地时间

$timezone = Magento\Framework\Stdlib\DateTime\TimezoneInterface // 获取本地当前时间 $timezone->date()->format('Y-m-d H:i:s'); // UTC时间转化成本地时间 $timezone->date(new \DateTime("2023-10-17 23:53:13"))->setTimezone(new \DateTimeZone('Asia/Shanghai'))->format("Y-m-d H:i:s"); 或者 $timezone->date(new \DateTime("2023-10-17 23:53:13"))->setTimezone(new \DateTimeZone($timezone->getConfigTimezone()))->format("Y-m-d H:i:s"); // 上面转换都是下面的原理 // 适用于任意时区转换成其他任意时区 // 确保传入的$date是$fromTimeZone时区的时间 $fromTimeZone = new \DateTimeZone('UTC'); $toTimeZone = new \DateTimeZone('Asia/Shanghai'); function convertDate($date, $fromTimeZone, $toTimeZone) { $datetime = new \DateTime($date, $fromTimeZone); $datetime->setTimezone($toTimeZone); return $datetime->format('Y-m-d H:i:s'); } // 时间修改参考DateTime::modify $timezone->date(xxx)->modify("+2 days") // 直接这样使用获取的是本地时间 $timezone->date("2023-10-17 23:53:13")->format('Y-m-d H:i:s'); // 获取UTC时间 $date = date('Y-m-d H:i:s'); // 或 $currentTime = date('Y-m-d H:i:s', strtotime('now'));

datetime 和 timestamp的使用建议

如果时间需要对比等运算使用timestamp,如果只展示可以使用datetime简化操作

19 November 2023