根据经纬度获取当地时区,设置时区

时区除了我们经常用的东八区,新需求是根据经纬度获取当地时区,并且将设备上的时区更新到当前时区

获取当前位置的经纬度是基本要求,本项目中有获取全球任意城市的天气需求,所以两个功能我就结合起来做了

1、获取天气信息 Api地址

Current weather data - OpenWeatherMap

有几种方式获取到城市的天气,而且当前API是免费获取,我的需求是根据经纬度获取

根据经纬度获取当地时区,设置时区_第1张图片

我用的是这个方法,可以获取到我所需要的尽可能详细的信息

其中天气接口返回的值里面有一个关键字

 根据经纬度获取当地时区,设置时区_第2张图片

timezone字段的意思就是当前时区相对标准时区的偏移量,单位是秒

计算相差时间: 32400 / 60  / 60 = 9小时

经纬度请求回来的接口里面会包含这个偏移量

天气信息全部在接口中返回,timezone是我获取下一步时区id的关键字段

2、获取时区id

根据经纬度获取当地时区,设置时区_第3张图片

 TimeZone类是获取时区的关键类,里面有多种获取方法,其中的

getAvailableIDs

有带参和不带参两种

a、不带参

根据经纬度获取当地时区,设置时区_第4张图片

返回设备上所有的时区名,是一个String数组, 可以用来设置当前设备时区

b、带参数

根据经纬度获取当地时区,设置时区_第5张图片

带的参数就是便宜量,注意这个偏移量是毫秒 ,这个方法返回的值也是一个数组,是根据当前偏移量计算返回的时区名数组,这个数组对我来说就是设置时区的关键

获取到当前经纬度返回的时区名数组 timeZoneName[];

3、设置时区

一个偏移量可能包含了多个时区名,比如中国是东八区,你传入28800,返回的是所有东八区的时区名

Asia/Shanghai 
Asia/Hong_Kong
Asia/Taipei

这几个都是东八区的时区名,设置任何一个都是中国大陆的标准时间,所以当我们通过getAvailableIDs(int offset)获取到时区名称数组的时候,取其中任意一个设置的都是正确的时间

设置时区代码

 AlarmManager mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                if (mAlarmManager != null)
                    mAlarmManager.setTimeZone(name);

当设置完时区之后,我发现我的页面上时间并没有更新,所以我在1秒钟延迟之后,发一个event手动更新UI,也就是再获取一次设置完时区之后的当前时间,就OK啦

 
  
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void setTime(Status.TimeEvent event) {
        String formattedTime = DateUtils.getFormatedDataHM2(System.currentTimeMillis(), "");
        if (!DateUtils.get24HourMode(getContext()))
            formattedTime = DateUtils.getFormatedDataHM();
        mTime.setText(formattedTime);
    }

你可能感兴趣的:(学习记录,android)