Android设置时区功能开发

3,915 阅读1分钟

本文介绍Android系统应用设置中时区的开发。开发时区功能用到系统提供的SettingsLib.jar包。文章末尾会提供RK3588SettingLib.jar,大家根据自己实际项目判断是否可行。

1、标准API下的时区选择

在没有firmware工程师提供jar包情况下,自己实现的时区列表效果如下,其中时间代表时间偏移。

image-20230703103252102

实现代码如下:

object TimezoneUtils {
    private const val TAG = "TimezoneUtils"
    fun getTimeZoneInfo(): List<TimeZoneInfo> {
        val list = mutableListOf<TimeZoneInfo>()
        val default = getCurTimeZone()
        TimeZone.getAvailableIDs().forEach {
            val zone = TimeZone.getTimeZone(it)
            val name: String = zone.getDisplayName(false,TimeZone.LONG)
            val offset = "${zone.rawOffset / (1000 * 60 * 60)}"
            val info = TimeZoneInfo(name, it, offset, default.id == it)
            list.add(info)
        }
        return list
    }

    fun setCurTimeZone(id: String) {
        val zone = java.util.TimeZone.getTimeZone(id)
        java.util.TimeZone.setDefault(zone)
    }

}

data class TimeZoneInfo(var name: String, val id: String, var time: String = "", var selected: Boolean = false)

代码中将相关时区信息封装成TimeZoneInfo,属性name就是上图的格林尼治标准时间,id就是用于设置和获取时区的唯一标识,例如Asia/Shanghai,time就是各个时区相对于格林尼治标准时间的偏移。

TimezoneUtils工具类中,我们通过getTimeZoneInfo函数列表获取时区列表即可用于进一步操作,例如显示。

2、在jar情况下时区选择

其实原理也是通过扒firmware的代码来实现,动手能力强的完全可以自己实现,这里也是为了大家方便快速开发。相关资源会在末尾提供。

实现效果如下:

image-20230703104240872

通过这种方式实现,我们可以获取更加准确地址显示,而不是标准时间。

public static List<TimeZoneBean> getTimeZoneList()  {
    List<TimeZoneBean> timeZoneBeanList=new ArrayList<>();
    List<Map<String, Object>> timezones = ZoneGetter.getZonesList(BaseApplication.context);
    for(Map<String, Object> zones:timezones)
    {
        String name= (String) zones.get("name");
        String gmt = (String) zones.get("gmt");
        String ids=(String) zones.get("id");
        TimeZoneBean timeZoneBean=new TimeZoneBean(ids,gmt,name);
        timeZoneBeanList.add(timeZoneBean);

    }

    return timeZoneBeanList;
}

这里将时区信息封装了TimeZoneBean实体类,然后通过ZoneGetter获取时区信息。文字末尾提供一个压缩包,内容有一个timezones.xml文件,放在xml文件夹下即可,一个jar包,依赖到工程中,一个ZoneGetter类,放在哪个package下都可以。然后我们正常使用,调用上面的getTimeZoneList函数即可。

3、获取当前时区

  fun getCurTimeZone(): TimeZoneInfo {
      val zone = TimeZone.getDefault()
      val name = zone.getDisplayName()
      val offset = "${zone.rawOffset / (1000 * 60 * 60)}"
      val info = TimeZoneInfo(name, zone.id, offset)
      return info
  }

即通过TimeZone.getDefault获取当前时区。

4、设置当前时区

这里的id就是前面获取时区列表的ID,例如Asia/Shanghai,然后通过AlarmManager进行设置。

public static void setTimeZone(String id)
{
    TimeZone tz = TimeZone.getTimeZone(id);
    TimeZone.setDefault(tz);

    AlarmManager alarm = (AlarmManager)BaseApplication.context.getSystemService(Context.ALARM_SERVICE);
    alarm.setTimeZone(id);
}

或者:

  fun setCurTimeZone(id: String) {
      val zone = TimeZone.getTimeZone(id)
      TimeZone.setDefault(zone)
  }

好了,你已经学会了。

时区资源

image-20230703105546458