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

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

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

1、获取天气信息 Api地址

Current weather data - OpenWeatherMap

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

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

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

 

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

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

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

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

2、获取时区id

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

getAvailableIDs

有带参和不带参两种

a、不带参

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

b、带参数

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

获取到当前经纬度返回的时区名数组 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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值