夏令时引起仪表时间显示错误

一、问题现象

测试同事反馈,车机设置不同时区,车机时间显示正确,而仪表显示时间不对。

二、问题背景

车机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;
    

你可能感兴趣的:(车机系统,android,java)