Yii2 国际化之时区转换


一、说在前面

首先明白,应用里有两个地方可设置时区,

一是application里的timezone,

这里的时区设置是整个应用的时区设置,在Application.php源码里可看到:它会作用于date函数,


这里有这样的一个场景:

A是UTC时区的用户,他电脑上显示的时间是上午12点,他在Yii2(应用时区设置是PRC)上创建的一条数据,那这条记录的created_at是什么时间?是的,created_at是PRC的时间,即晚上8点。因为created_at是通过date函数生成。

二是formatter的defaultTimeZone和timeZone 属性

使用formatter转换时间时,会先判断这里的defaultTimeZone与formatter中的timezone的时间差,然后将转换后的时间显示出来。

时区转换参考代码:yii::$app->formatter->asDatetime($model['updated_at'],'full');

时区转换:从defaultTimeZone时区转到timezone时区,因此,defaultTimeZone的值需与application中的timezone保持一致

(若formatter的timezone未指定,默认取application的timezone,需要转换时区显示的时候,修改formatter的timezone即可)

这里是一个简单的例子:

formatter里的timezone是UTC

formatter的defaultTimeZone是PRC

数据库有一条记录时间值是

2019-04-04  20:00:00

那在页面上使用formatter转换时间时,显示的时间是多少?

2019-04-04  12:00:00

二、既然是国际化应用,难免会有不同时区的用户在使用同一个yii2应用,这个时候,时间如何处理?

1、应用时区设置:

application里的timezone是PRC

formatter里的timezone是PRC(目标时区)

formatter的defaultTimeZone是PRC

场景:UTC用户和PRC用户同时在Yii2上写工作日志,能够查看对方的记录

数据库有记录时间两个的字段:created_at和work_date

created_at是应用通过date函数生成,work_date是用户通过HTML界面日期组件选择的,

因为不同时区的用户,终端电脑的时间是不一样的,

假如UTC用户选择work_date为当前时间:上午12点,但实际上created_at字段入库的时间是晚上8点(PRC)。那UTC的用户就很尴尬了,明明现在只是中午12点,看到这条记录的创建时间却是20点,时间穿越了?


这里是解决的方案:

1、用户必须选择自己所在的时区,

2、通过组件选择的时间字段需全部转换成PRC时间入库,也就是work_date入库时间应该为20点

3、保存后查看时,将work_date和created_at通过formatter(defaultTimeZone是PRC,timezone是UTC)转后显示出来

  都将显示为上午12点。

总而言之:

1、formatter的defaultTimeZone必须与application的timezone保持一致,

2、只能通过修改formatter里的timezone来修改显示的时区时间,

3、所有时间字段在入库时,必须保持与application->timezone的时区时间一致,

4、项目一旦部署,不要再修改application->timezone,更不能由用户选择时区而改变application->timezone。

5、application->timezone可以在common\config\main.php中设置,也可以在每个应用中的config\main.php中设置

你可能感兴趣的:(Yii2 国际化之时区转换)