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
对于常用的
timestamp,Magento的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