Java 基于位置的时区检索
给定:LDAP存储用户的位置 我如何使用他们的位置驾驶他们的时区?接受任何指针,首选Java语言Java 基于位置的时区检索,java,timezone,Java,Timezone,给定:LDAP存储用户的位置 我如何使用他们的位置驾驶他们的时区?接受任何指针,首选Java语言 提前感谢。这取决于“位置”包含的信息?您可能需要将位置映射到时区名称,最好是奥尔森风格的时区名称,因为它们更详细,更容易映射,因为它们本身就是位置 如果它是一个近似的地址(如国家和城市等),那么一些地理定位服务的信息中确实包含时区,因此您可以调用这些服务并查看 如果是一个有纬度和经度的地理位置,那么一个名为Earthtools的站点可以为您提供时区 该数据库提供从城市和国家到时区的映射: 不幸的是,
提前感谢。这取决于“位置”包含的信息?您可能需要将位置映射到时区名称,最好是奥尔森风格的时区名称,因为它们更详细,更容易映射,因为它们本身就是位置 如果它是一个近似的地址(如国家和城市等),那么一些地理定位服务的信息中确实包含时区,因此您可以调用这些服务并查看 如果是一个有纬度和经度的地理位置,那么一个名为Earthtools的站点可以为您提供时区 该数据库提供从城市和国家到时区的映射:
不幸的是,它使用Windows时区名称,但您可以从Unicode.org获取这些数据,以便在Windows时区名称和Olson TZ名称之间进行映射 我还没有真正做到这一点,但以下几点应该行得通:
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:更新了一些可能有用的链接。这个答案很好:我也使用它,但它没有提供任何关于时区的信息(我使用免费版本,我不知道付费版本)