Java 基于位置的时区检索

Java 基于位置的时区检索,java,timezone,Java,Timezone,给定:LDAP存储用户的位置 我如何使用他们的位置驾驶他们的时区?接受任何指针,首选Java语言 提前感谢。这取决于“位置”包含的信息?您可能需要将位置映射到时区名称,最好是奥尔森风格的时区名称,因为它们更详细,更容易映射,因为它们本身就是位置 如果它是一个近似的地址(如国家和城市等),那么一些地理定位服务的信息中确实包含时区,因此您可以调用这些服务并查看 如果是一个有纬度和经度的地理位置,那么一个名为Earthtools的站点可以为您提供时区 该数据库提供从城市和国家到时区的映射: 不幸的是,

给定:LDAP存储用户的位置

我如何使用他们的位置驾驶他们的时区?接受任何指针,首选Java语言


提前感谢。

这取决于“位置”包含的信息?您可能需要将位置映射到时区名称,最好是奥尔森风格的时区名称,因为它们更详细,更容易映射,因为它们本身就是位置

如果它是一个近似的地址(如国家和城市等),那么一些地理定位服务的信息中确实包含时区,因此您可以调用这些服务并查看

如果是一个有纬度和经度的地理位置,那么一个名为Earthtools的站点可以为您提供时区

该数据库提供从城市和国家到时区的映射:


不幸的是,它使用Windows时区名称,但您可以从Unicode.org获取这些数据,以便在Windows时区名称和Olson TZ名称之间进行映射

我还没有真正做到这一点,但以下几点应该行得通:

  • 您可以首先使用java库从城市-州-国家获取经度/纬度

  • 接下来,您可以使用Lennart提到的(以及您自己的一些java代码)来获取时区:)

  • 我们正在使用获取有关用户位置的信息。他们有一个付费版本(准确率99.8%)和一个付费版本(准确率99.5%)

    它们还为您提供Java、C、PHP等API,使您能够查询其数据库,您可以在本地下载并保存这些数据库(每月提供更新)。数据库根据IP地址为您提供有关客户城市、州、国家等的信息

    希望这有帮助

     Try this code for use Google Time Zone API from Java:
    
    String获取xml服务器响应(String服务器url){
    URL xml_server=null;
    字符串xmltext=“”;
    输入流输入;
    试一试{
    xml\u server=新URL(服务器URL);
    试一试{
    input=xml_server.openConnection().getInputStream();
    最终BufferedReader读取器=新的BufferedReader(新的InputStreamReader(输入));
    最终StringBuilder sBuf=新StringBuilder();
    字符串行=null;
    试一试{
    而((line=reader.readLine())!=null)
    {
    sBuf.append(行);
    }
    } 
    捕获(IOE异常)
    {
    e(e.getMessage(),“XML解析器,stream2string 1”);
    } 
    最后{
    试一试{
    input.close();
    }
    捕获(IOE异常)
    {
    e(e.getMessage(),“XML解析器,stream2string 2”);
    }
    }
    xmltext=sBuf.toString();
    }捕获(IOE1异常){
    e1.printStackTrace();
    }
    }捕获(格式错误的异常e1){
    e1.printStackTrace();
    }
    返回xmltext;
    }     
    私有字符串从时间戳(长时间戳)获取UTC日期时间{
    试一试{
    Calendar cal=Calendar.getInstance();
    时区tz=cal.getTimeZone();
    int tzt=tz.getOffset(System.currentTimeMillis());
    时间戳-=tzt;
    //DateFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”,Locale.getDefault());
    DateFormat sdf=新的SimpleDataFormat();
    日期netDate=(新日期(时间戳));
    返回sdf.format(netDate);
    }
    捕获(例外情况除外){
    返回“”;
    }
    } 
    NTP\U UTC\U类时间
    {
    私有静态最终字符串TAG=“SntpClient”;
    专用静态最终整数接收时间偏移=32;
    专用静态最终整数传输时间偏移=40;
    专用静态最终int NTP_数据包大小=48;
    专用静态最终int NTP_端口=123;
    专用静态最终int NTP_模式_客户端=3;
    私有静态最终int NTP_版本=3;
    //1900年1月1日和1970年1月1日之间的秒数
    //70年加17个闰日
    专用静态最终长偏移量_1900_至_1970=(365L*70L)+17L)*24L*60L*60L;
    私生活时间长;
    公共布尔请求时间(字符串主机,int超时){
    试一试{
    DatagramSocket套接字=新DatagramSocket();
    socket.setSoTimeout(超时);
    InetAddress=InetAddress.getByName(主机);
    字节[]缓冲区=新字节[NTP_数据包大小];
    DatagramPacket请求=新的DatagramPacket(buffer,buffer.length,address,NTP_端口);
    
    buffer[0]=NTP_MODE_CLIENT |(NTP_VERSION@samsina:更新了一些可能有用的链接。这个答案很好:我也使用它,但它没有提供任何关于时区的信息(我使用免费版本,我不知道付费版本)