注:国内根据经纬度来获取夏令时区以及时区偏移量的api的服务有百度和谷歌,但是谷歌的获取夏令时和时区的api在国内服务其上部署时访问不了的(看过有在服务器上安装代理的,但是操作有点复杂。好吧,其实是我看着步骤太多,感觉太麻烦所以直接pass了)。
所以目前在我获取到的信息中,只有百度的api可以根据经纬度来获取时区等信息,但是百度api又需要注册申请key,所以此路又不通。
经过我反复查找发现了一个第三方库,可以根据经纬度来获取到时区Id然后再配合TimeZone类完美解决夏令时以及时区偏移量的问题,下面把代码以及库地址奉上。
1.首先我们需要将第三方库下载下来。(没有魔法操作访问不了github的可以直接联系我取jar包)
下载地址:https://github.com/drtimcooper/LatLongToTimezone
2.等下载之后打开idea,编译打包
3.然后将jar包引入我们需要使用的项目中的ib文件夹
4.将依赖加入到项目中的pom.xml文件中
<dependency>
<groupId>com.skedgo.converter</groupId>
<artifactId>timezone-mapper</artifactId>
<version>1.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/LatLongToTimezone-1.0.1SNAPSHOT.jar</systemPath>
</dependency>
5.最后我们就可以来操作代码了
//1.TimezoneMapper.latLngToTimezoneString就是我们引入第三方库的方法,将我们的经纬度传入方法中获取时区Id,例如:latitude:27.596977,longitude:-81.523515
String timezoneId = TimezoneMapper.latLngToTimezoneString(latitude,longitude );
//获取到的时区id:America/New_York
// 2. 使用 TimeZone 获取详细信息
TimeZone timeZone = TimeZone.getTimeZone(timezoneId);
// 3. 获取标准 UTC 偏移量(毫秒)
int rawOffset = timeZone.getRawOffset()/ 1000;
// 4.查看该时区是否是夏令时,true时夏令时,false非夏令时
ZoneId zoneId = ZoneId.of(timezoneId);
ZonedDateTime now = ZonedDateTime.now(zoneId);
boolean dst = now.getZone().getRules().isDaylightSavings(now.toInstant()) ;
//以上就是获取时区id以及偏移量和夏令时的操作
至此,根据经纬度获取时区id以及夏令时和偏移量的操作完成。
标签:JAVA,经纬度,夏令时,获取,偏移,偏移量,时区,now From: https://blog.csdn.net/weixin_42163782/article/details/145223738