2010-03-09 8 views
13

주어진 : LDAP 사용자의 위치를 ​​저장합니다.위치 기반 시간대 검색

위치를 사용하여 시간대를 어떻게 조정합니까? 자바 언어가 선호되는 모든 포인터가 허용됩니다.

미리 감사드립니다.

+0

이 대답은 중대하다 : http://stackoverflow.com/a/16086964/1121497는 –

답변

8

"위치"에 포함 된 정보에 따라 다릅니다. 위치 자체이기 때문에 위치를 시간대 이름 (예 : Olson 스타일의 표준 시간대 이름)으로 매핑해야합니다. 더 자세하고 쉽게 매핑 할 수 있기 때문에 위치 자체입니다.

대략적인 주소 (국가 및 도시 등) 인 경우 몇 가지 위치 정보 서비스는 정보에 시간대를 포함하므로 이러한 서비스를 호출하고 볼 수 있습니다.

위도와 경도가있는 지구 위치 정보가 있으면 Earthtools라는 사이트에서 시간대를 지정할 수 있습니다. http://www.earthtools.org/webservices.htm#timezone

이 시간대에 도시에서 매핑과 국가를 제공하는이 데이터베이스입니다

: http://citytimezones.info/cms/pending_requests.htm

불행히도 윈도우 시간대 이름을 사용,하지만 당신은 Unicode.org에서이 데이터를 http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml 윈도우 시간대 이름과 올슨 사이에 매핑 할 수 있습니다 TZ 이름.

+0

도시, 주, 나라 – samsina

+0

@samsina : 업데이트 도움이 될만한 몇 가지 링크가 있습니다. –

+0

참고 사항 [이 커뮤니티 위키 항목] (http://stackoverflow.com/q/16086962/634824) –

0

사실이하지 않은 그러나 다음과 같은 작업을해야합니다 : 먼저 도시 국가 국가의 위도/경도를 얻을 수 GeoGoogle 자바 라이브러리를 사용할 수 있습니다

  1. .

  2. 다음, 당신은 시간대 :

0

우리는 사용자의 위치에 관한 정보를 얻을 수있는 MaxMind GeoIP database를 사용하는을 얻을 수 레나 언급 EarthTools (그리고 자신의 일부 자바 코드)를 사용할 수 있습니다 . 그들은 유료 버전 (99.8 % 정확도)과 free version (99.5 % 정확도)을 가지고 있습니다.

또한 Java, C, PHP 등의 API를 제공하므로 데이터베이스를 쿼리하여 로컬에서 다운로드하고 유지할 수 있습니다 (매월 업데이트 제공). 이 데이터베이스는 고객의 도시, 주, 국가 등의 정보를 IP 주소를 기반으로 제공합니다.

희망이 도움이됩니다.

+0

나도 사용하지만 시간대에 대한 정보는 제공하지 않습니다 (무료 버전을 사용하고 있습니다. 유료 버전에 대해 안다) –

0
Try this code for use Google Time Zone API from Java: 
String get_xml_server_reponse(String server_url){ 

    URL xml_server = null; 

    String xmltext = ""; 

    InputStream input; 


    try { 
     xml_server = new URL(server_url); 


     try { 
      input = xml_server.openConnection().getInputStream(); 


      final BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
      final StringBuilder sBuf = new StringBuilder(); 

      String line = null; 
      try { 
       while ((line = reader.readLine()) != null) 
       { 
        sBuf.append(line); 
       } 
       } 
      catch (IOException e) 
       { 
        Log.e(e.getMessage(), "XML parser, stream2string 1"); 
       } 
      finally { 
       try { 
        input.close(); 
        } 
       catch (IOException e) 
       { 
        Log.e(e.getMessage(), "XML parser, stream2string 2"); 
       } 
      } 

      xmltext = sBuf.toString(); 

     } catch (IOException e1) { 

       e1.printStackTrace(); 
      } 


     } catch (MalformedURLException e1) { 

      e1.printStackTrace(); 
     } 

    return xmltext; 

    }  


private String get_UTC_Datetime_from_timestamp(long timeStamp){ 

    try{ 

     Calendar cal = Calendar.getInstance(); 
     TimeZone tz = cal.getTimeZone(); 

     int tzt = tz.getOffset(System.currentTimeMillis()); 

     timeStamp -= tzt; 

     // DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault()); 
     DateFormat sdf = new SimpleDateFormat(); 
     Date netDate = (new Date(timeStamp)); 
     return sdf.format(netDate); 
    } 
    catch(Exception ex){ 
     return ""; 
    } 
    } 

class NTP_UTC_Time 
{ 
    private static final String TAG = "SntpClient"; 

    private static final int RECEIVE_TIME_OFFSET = 32; 
    private static final int TRANSMIT_TIME_OFFSET = 40; 
    private static final int NTP_PACKET_SIZE = 48; 

    private static final int NTP_PORT = 123; 
    private static final int NTP_MODE_CLIENT = 3; 
    private static final int NTP_VERSION = 3; 

    // Number of seconds between Jan 1, 1900 and Jan 1, 1970 
    // 70 years plus 17 leap days 
    private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; 

    private long mNtpTime; 

    public boolean requestTime(String host, int timeout) { 
     try { 
      DatagramSocket socket = new DatagramSocket(); 
      socket.setSoTimeout(timeout); 
      InetAddress address = InetAddress.getByName(host); 
      byte[] buffer = new byte[NTP_PACKET_SIZE]; 
      DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); 

      buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3); 

      writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET); 

      socket.send(request); 

      // read the response 
      DatagramPacket response = new DatagramPacket(buffer, buffer.length); 
      socket.receive(response);   
      socket.close(); 

      mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);    
     } catch (Exception e) { 
      // if (Config.LOGD) Log.d(TAG, "request time failed: " + e); 
      return false; 
     } 

     return true; 
    } 


    public long getNtpTime() { 
     return mNtpTime; 
    } 


    /** 
     * Reads an unsigned 32 bit big endian number from the given offset in the buffer. 
     */ 
    private long read32(byte[] buffer, int offset) { 
     byte b0 = buffer[offset]; 
     byte b1 = buffer[offset+1]; 
     byte b2 = buffer[offset+2]; 
     byte b3 = buffer[offset+3]; 

     // convert signed bytes to unsigned values 
     int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0); 
     int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1); 
     int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2); 
     int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3); 

     return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3; 
    } 

    /** 
     * Reads the NTP time stamp at the given offset in the buffer and returns 
     * it as a system time (milliseconds since January 1, 1970). 
     */  
    private long readTimeStamp(byte[] buffer, int offset) { 
     long seconds = read32(buffer, offset); 
     long fraction = read32(buffer, offset + 4); 
     return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L)/0x100000000L);   
    } 

    /** 
     * Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900 
     */  
    private void writeTimeStamp(byte[] buffer, int offset) {   
     int ofs = offset++; 

     for (int i=ofs;i<(ofs+8);i++) 
      buffer[i] = (byte)(0);    
    } 

} 

String get_time_zone_time(GeoPoint gp){ 

     String erg = ""; 
     String raw_offset = ""; 
     String dst_offset = ""; 

     double Longitude = gp.getLongitudeE6()/1E6; 
     double Latitude = gp.getLatitudeE6()/1E6; 

     // String request = "http://ws.geonames.org/timezone?lat="+Latitude+"&lng="+ Longitude+ "&style=full"; 


     long tsLong = 0; // System.currentTimeMillis()/1000; 

     NTP_UTC_Time client = new NTP_UTC_Time(); 

     if (client.requestTime("pool.ntp.org", 2000)) {    
      tsLong = client.getNtpTime(); 
     } 

     if (tsLong != 0) 
     { 

     tsLong = tsLong/1000; 

     // https://maps.googleapis.com/maps/api/timezone/xml?location=39.6034810,-119.6822510&timestamp=1331161200&sensor=true 

     String request = "https://maps.googleapis.com/maps/api/timezone/xml?location="+Latitude+","+ Longitude+ "&timestamp="+tsLong +"&sensor=true"; 

     String xmltext = get_xml_server_reponse(request); 

     if(xmltext.compareTo("")!= 0) 
     { 

     int startpos = xmltext.indexOf("<TimeZoneResponse"); 
     xmltext = xmltext.substring(startpos); 



     XmlPullParser parser; 
     try { 
      parser = XmlPullParserFactory.newInstance().newPullParser(); 


      parser.setInput(new StringReader (xmltext)); 

      int eventType = parser.getEventType(); 

      String tagName = ""; 


      while(eventType != XmlPullParser.END_DOCUMENT) { 
       switch(eventType) { 

        case XmlPullParser.START_TAG: 

          tagName = parser.getName(); 

         break; 


        case XmlPullParser.TEXT : 


         if (tagName.equalsIgnoreCase("raw_offset")) 
          if(raw_offset.compareTo("")== 0)        
          raw_offset = parser.getText(); 

         if (tagName.equalsIgnoreCase("dst_offset")) 
          if(dst_offset.compareTo("")== 0) 
          dst_offset = parser.getText(); 


         break; 

       } 

       try { 
         eventType = parser.next(); 
        } catch (IOException e) { 

         e.printStackTrace(); 
        } 

       } 

       } catch (XmlPullParserException e) { 

        e.printStackTrace(); 
        erg += e.toString(); 
       } 

     }  

     int ro = 0; 
     if(raw_offset.compareTo("")!= 0) 
     { 
      float rof = str_to_float(raw_offset); 
      ro = (int)rof; 
     } 

     int dof = 0; 
     if(dst_offset.compareTo("")!= 0) 
     { 
      float doff = str_to_float(dst_offset); 
      dof = (int)doff; 
     } 

     tsLong = (tsLong + ro + dof) * 1000; 



     erg = get_UTC_Datetime_from_timestamp(tsLong); 
     } 


    return erg; 

} 

과 함께 사용 :

GeoPoint gp = new GeoPoint(39.6034810,-119.6822510); 
String Current_TimeZone_Time = get_time_zone_time(gp); 
+1

이 코드는 너무 나쁘기 때문에 눈이 피였다. –