时区除了我们经常用的东八区,新需求是根据经纬度获取当地时区,并且将设备上的时区更新到当前时区
获取当前位置的经纬度是基本要求,本项目中有获取全球任意城市的天气需求,所以两个功能我就结合起来做了
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);
}