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

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

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

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);
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java的TimeZone类和经纬度信息来获取对应的时区,具体实现如下: ```java import java.util.TimeZone; public class TimeZoneUtil { public static TimeZone getTimeZone(double latitude, double longitude) { TimeZone timeZone = TimeZone.getDefault(); timeZone = TimeZone.getTimeZone(getTimeZoneId(latitude, longitude)); return timeZone; } private static String getTimeZoneId(double latitude, double longitude) { String timeZoneId = null; timeZoneId = TimeZone.getTimeZone("GMT").getID(); TimeZone tz = TimeZone.getTimeZone(timeZoneId); double hour = getRawOffset(tz) / 3600000.0; double lngHour = longitude / 15.0; double time = hour + lngHour; int intTime = (int) Math.floor(time); if (intTime == time) { timeZoneId = getTimeZoneOffset((int) time); } else { timeZoneId = getTimeZoneOffset((int) intTime) + "," + getTimeZoneOffset((int) (intTime + 1)); } return timeZoneId; } private static String getTimeZoneOffset(int offset) { String[] ids = TimeZone.getAvailableIDs(offset * 60 * 60 * 1000); if (ids.length == 0) { return "GMT"; } return ids[0]; } private static int getRawOffset(TimeZone tz) { if (tz.inDaylightTime(new java.util.Date())) { return tz.getRawOffset() + tz.getDSTSavings(); } else { return tz.getRawOffset(); } } } ``` 在上面的代码中,使用了一个名为getTimeZoneId的方法来获取对应的时区ID。该方法根据传入的经纬度信息计算出对应的时区ID,并返回该ID。 在计算时区ID时,我们首先获取了GMT时区的ID,然后根据经度信息计算出所在时区的偏移量,再根据偏移量获取对应的时区ID。 最后,我们使用getTimeZone方法根据时区ID获取对应的TimeZone对象,即可获取到对应的时区。 使用示例: ```java import java.util.TimeZone; public class Main { public static void main(String[] args) { // 假设经纬度分别为纽约市的坐标 double latitude = 40.7128; double longitude = -74.0060; // 获取对应的时区 TimeZone timeZone = TimeZoneUtil.getTimeZone(latitude, longitude); System.out.println(timeZone.getID()); // 输出: America/New_York System.out.println(timeZone.getDisplayName()); // 输出: Eastern Standard Time System.out.println(timeZone.getRawOffset()); // 输出: -18000000 } } ``` 在上面的示例中,我们传入纽约市的经纬度信息,使用TimeZoneUtil类获取对应的TimeZone对象,并输出相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值