一、问题现象
测试同事反馈,车机设置不同时区,车机时间显示正确,而仪表显示时间不对。
二、问题背景
车机Android系统时间变化时,会同步当前系统UTC时间及时区信息给MCU,由MCU根据时区信息转换为本地时间后,每一分钟变化时将本地时间发送至CAN总线,仪表根据CAN总线时间进行显示。
三、问题分析
由于部分国家使用夏令时,存在15分钟、30分钟、45分钟、1小时等非整数小时的Offset(相对UTC+0时间)时间差,同时夏令时启用仅在一段日期类生效。固原方案仅使用时区来计算本地时间时,当启用夏令时时存在错误。
四、解决方法
1、将当前本地时区的Offset(单位秒)发送至MCU,由MCU根据UTC时间与Offset进行求和即可。
2、系统根据当前时区是否启用夏令时获取Offset值。
3、代码实现如下。
/**
* 同步系统时间和时区至MCU
* utcTimeSecs utc时间,单位秒
* zone 本地时区 + 12,0 - 24 表示 -12 - 12
* offsetSecs 本地时间与utc时间差,单位秒
*/
private void syncTimeAndZoneToMcu() {
int utcTimeSecs = (int) (System.currentTimeMillis() / 1000);
TimeZone localZone = TimeZone.getDefault();
int zone = localZone.getRawOffset() / 3600000 + 12;