java通过ip获取时区
1.IP地址数据库:需要一个IP地址数据库,其中包含了IP地址与地理位置信息的映射关系。常用的IP地址数据库有MaxMind、GeoIP等。你可以在它们的官网上下载并导入到你的项目中的resources目录下。
2.需要导入的依赖
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.8.1</version>
</dependency>
3.实现代码
private Map<String, String> getZoneIdByIp(Map<String, String> ipMap, Set<String> macHexs) {
Map<String, String> deviceZone = new HashMap<>();
try {
String resourcesPath = "IPCityDB/GeoLite2-City.mmdb";
String resourcesPathNew = getResourcesPath(resourcesPath);
File database = new File(resourcesPathNew);
DatabaseReader dbReader = new DatabaseReader.Builder(database).build();
for (String macHex : ipMap.keySet()) {
// 过滤在线设备
if (!macHexs.contains(macHex)) {
continue;
}
// 要查询的IP地址
InetAddress ipAddress = InetAddress.getByName(ipMap.get(macHex));
CityResponse response = dbReader.city(ipAddress);
// 获取时区
String timeZoneId = response.getLocation().getTimeZone();
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
deviceZone.put(macHex, timeZone.getID());
}
// 关闭 DatabaseReader
dbReader.close();
} catch (Exception e) {
e.printStackTrace();
}
return deviceZone;
}
/**
*获取文件路径
*/
public String getResourcesPath(String filePath) {
String resourcePath;
File file = new File(filePath);
try {
Resource resource = new ClassPathResource(filePath);
InputStream inputStream = resource.getInputStream();
FileUtils.copyInputStreamToFile(inputStream, file);
resourcePath = file.getAbsolutePath();
} catch (IOException e) {
log.info("获取资源路径失败:{}",e.getMessage());
throw new RuntimeException(e);
}
return resourcePath;
}