Android 修改系统时区导致SimpleDateFormat无法输出正确时间

简介: Android 修改系统时区导致SimpleDateFormat无法输出正确时间

平台


RK3288 + Android 7.1


问题


修改系统时区后, 使用SimpleDateFormat 无法转化出正确的时间.


final String DatePattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(DatePattern, Locale.getDefault());
    @Override
    protected void onResume() {
        super.onResume();
        Date date = new Date();
        android.util.Log.d("DateTest", sdf.format(date);
    }


测试步骤:


进入测试Activity

按HOME键返回Launcher

打开设置->时间和日期

关闭自动确认日期和时间, 关闭自动确定时区.

选择一个与当前不同的时区.

返回测试Activity.

在这个过程中, onResume会执行两次, 假设在2->6总共花费了1分钟, 时区由 GMT+8 切换为 GMT+1 :

第一次输出的时间为:

2019-07-17 08:00:00


第二次输出的时间为:

预期: 2019-07-17 01:01:00

实际: 2019-07-17 08:01:00


分析与解决方案


测试后发现, 原因在于SimpleDateFormat中的时区并没有跟随实际时区变化而改变:


final String DatePattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(DatePattern, Locale.getDefault());


解决的方法是在时区变化后, 重新创建SimpleDateFormat.


final String DatePattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(DatePattern, Locale.getDefault());
    @Override
    protected void onResume() {
        super.onResume();
  sdf = new SimpleDateFormat(DatePattern, Locale.getDefault());
        Date date = new Date();
        android.util.Log.d("DateTest", sdf.format(date);
    }


扩展


在Android中, 可以通过注册时区变化广播来触发更新相关代码, 参考:

|-- frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java


IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);
        filter.addAction(Intent.ACTION_TIME_CHANGED);
        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
        getContext().registerReceiver(mIntentReceiver, filter, null, null);


相关文章
|
3天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
16 1
|
1月前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
21 1
|
2月前
|
搜索推荐 Android开发 iOS开发
探析安卓与iOS系统的优劣
【2月更文挑战第7天】安卓与iOS是当今手机市场上最主流的两款操作系统,各有优劣。本文将从用户体验、开放程度、生态系统等方面对两者进行深入探析,以期帮助读者更好地了解它们的特点。
|
3天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
18 0
|
3天前
|
Android开发
Android构建系统:Android.mk(2)函数详解
Android构建系统:Android.mk(2)函数详解
12 1
|
3天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
34 1
|
3天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
21 1
|
3天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
22 0
|
3天前
|
测试技术 Android开发 开发者
RK3568 Android系统客制化动态替换ro任意属性
RK3568 Android系统客制化动态替换ro任意属性
23 1
|
3天前
|
存储 Linux Android开发
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
18 0