455 votes

Comment obtenir le fuseau horaire d'un lieu à l'aide des coordonnées de latitude et de longitude ?

Compte tenu de la latitude et de la longitude d'un lieu, comment savoir quel est le fuseau horaire en vigueur dans ce lieu ?

Dans la plupart des cas, nous recherchons un identifiant de fuseau horaire IANA/Olson, bien que certains services puissent renvoyer un simple décalage UTC ou un autre identifiant de fuseau horaire. Veuillez lire le info sur le fuseau horaire pour les détails.

4 votes

J'ai remarqué que l'horodatage UTC n'est pas nécessaire pour déterminer le fuseau horaire. Par exemple, un long/lat à Londres n'est pas suffisant pour déterminer si le fuseau horaire est GMT ou BST (British Summer Time / daylight savings). Ainsi, pour déterminer le fuseau horaire correct, vous avez sûrement besoin de lat, long et d'un horodatage UTC.

12 votes

@MichaelWaterfall - Pour déterminer si vous êtes en GMT (UTC+0000) ou en BST (UTC+0100) - oui, vous avez tout à fait raison. Mais il s'agit de fuseaux horaires offsets et non les identifiants de fuseau horaire. Les deux sont couverts par le même "Europe/London" identifiant du fuseau horaire de la base de données des fuseaux horaires de l'IANA.

0 votes

Ah ok, et le décalage d'heure d'été sera ajouté (si nécessaire) une fois le rendu d'une heure avec un identifiant de fuseau horaire donné ?

632voto

Matt Johnson Points 33433

Fuseau horaire Localisation Services Web

Données brutes sur les limites des fuseaux horaires

Les projets suivants ont été précédemment des sources de données sur les limites des fuseaux horaires, mais ne sont plus activement maintenus.

Implémentations hors ligne de la géolocalisation par fuseau horaire

Les implémentations qui utilisent les données du constructeur de fuseaux horaires

Les implémentations qui utilisent les anciennes données tz_world

Bibliothèques qui appellent l'un des services web

  • fuseau horaire - Gemme Ruby qui appelle GeoNames
  • AskGeo possède ses propres bibliothèques pour les appels à partir de Java ou de .Net.
  • Noms géographiques a des bibliothèques clientes pour à peu près tout

Services web auto-hébergés

Autres idées

Veuillez mettre à jour cette liste si vous en connaissez d'autres.

Notez également que l'approche de la ville la plus proche peut ne pas donner le "bon" résultat, mais seulement une approximation.

Conversion en zones Windows

La plupart des méthodes répertoriées renvoient un identifiant de fuseau horaire IANA. Si vous devez convertir un fuseau horaire Windows pour l'utiliser avec la méthode TimeZoneInfo dans .NET, utilisez la classe TimeZoneConverter bibliothèque.

N'utilisez pas zone.tab

El base de données tz comprend un fichier appelé zone.tab . Ce fichier est principalement utilisé pour présenter une liste de fuseaux horaires parmi lesquels l'utilisateur peut choisir. Il comprend les coordonnées de latitude et de longitude du point de référence de chaque fuseau horaire. Cela permet de créer une carte mettant en évidence ces points. Par exemple, voir la carte interactive présentée sur la page d'accueil du fuseau horaire .

Bien qu'il puisse être tentant d'utiliser ces données pour résoudre le fuseau horaire à partir des coordonnées de latitude et de longitude, il faut tenir compte du fait qu'il s'agit de points et non de frontières. Le mieux que l'on puisse faire serait de déterminer le le plus proche qui, dans de nombreux cas, ne sera pas le bon point.

Prenons l'exemple suivant :

                            Time Zone Example Art

Les deux carrés représentent des fuseaux horaires différents, où le point noir dans chaque carré est l'emplacement de référence, comme ce que l'on peut trouver dans zone.tab. Le point bleu représente l'emplacement pour lequel nous essayons de trouver un fuseau horaire. Il est clair que cet endroit se trouve dans la zone orange à gauche, mais si nous ne regardons que la distance la plus proche du point de référence, il se résout dans la zone verdâtre à droite.

2 votes

GeoNames est en fait parfait pour ce dont j'ai besoin. Merci !

1 votes

@Matt Cependant, si je comprends bien, il n'existe actuellement aucune base de données hors ligne qui fournirait des informations sur le fuseau horaire et le décalage par rapport à l'UTC en fonction des coordonnées de l'emplacement ?

0 votes

@MattJohnson comment puis-je utiliser les bibliothèques clients de Geonames ?

10voto

zbinsd Points 440

Que pensez-vous de cette solution pour node.js https://github.com/mattbornski/tzwhere

Et son homologue Python : https://github.com/pegler/pytzwhere

1 votes

Je les ai ajoutés à la réponse du wiki communautaire ci-dessus. Merci !

0voto

Tom Points 151

Ok, voici la version courte sans le temps NTP correct :

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;

} 

long get_time_zone_time_l(GeoPoint gp){

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

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

        long tsLong = System.currentTimeMillis()/1000;

        if (tsLong != 0)
        {

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

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

        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;

        }

  return tsLong;

}

Et l'utiliser avec :

GeoPoint gp = new GeoPoint(39.6034810,-119.6822510);
long Current_TimeZone_Time_l = get_time_zone_time_l(gp);

0voto

Tom Points 151

Si vous voulez utiliser geonames.org, utilisez ce code. (Mais geonames.org est parfois très lent)

String get_time_zone_time_geonames(GeoPoint gp){

        String erg = "";

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

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

        URL time_zone_time = null;

        InputStream input;
       // final StringBuilder sBuf = new StringBuilder();

        try {
            time_zone_time = new URL(request);

        try {
            input = time_zone_time.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");
                }
            }

             String xmltext = sBuf.toString();

             int startpos = xmltext.indexOf("<geonames");
             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("time"))
                          erg = parser.getText();  

                    break;   

                }

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

                    e.printStackTrace();
                }

            }

            } catch (XmlPullParserException e) {

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

            } catch (IOException e1) {

                e1.printStackTrace();
            }

            } catch (MalformedURLException e1) {

                e1.printStackTrace();
            }

        return erg;

 }

Et l'utiliser avec :

GeoPoint gp = new GeoPoint(39.6034810,-119.6822510);
String Current_TimeZone_Time = get_time_zone_time_geonames(gp);

0voto

user4042384 Points 1

En utilisant la latitude et la longitude obtenir le fuseau horaire de l'emplacement actuel le code ci-dessous a travaillé pour moi

String data = null;         
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Location ll = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
double lat = 0,lng = 0;
if(ll!=null){
    lat=ll.getLatitude();
    lng=ll.getLongitude();
}
System.out.println(" Last known location of device  == "+lat+"    "+lng);

InputStream iStream = null; 
HttpURLConnection urlConnection = null;
try{
    timezoneurl = timezoneurl+"location=22.7260783,75.8781553&timestamp=1331161200";                    
    // timezoneurl = timezoneurl+"location="+lat+","+lng+"&timestamp=1331161200";

    URL url = new URL(timezoneurl);                
    // Creating an http connection to communicate with url 
    urlConnection = (HttpURLConnection) url.openConnection(); 

    // Connecting to url 
    urlConnection.connect();                

    // Reading data from url 
    iStream = urlConnection.getInputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

    StringBuffer sb  = new StringBuffer();
    String line = "";
    while( ( line = br.readLine())  != null){
        sb.append(line);
    }
    data = sb.toString();
    br.close();

}catch(Exception e){
    Log.d("Exception while downloading url", e.toString());
}finally{
    try {
        iStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    urlConnection.disconnect();
}

try {
    if(data!=null){
        JSONObject jobj=new JSONObject(data);
        timezoneId = jobj.getString("timeZoneId");

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone(timezoneId));

        Calendar cl = Calendar.getInstance(TimeZone.getTimeZone(timezoneId));
        System.out.println("time zone id in android ==  "+timezoneId);

        System.out.println("time zone of  device in android == "+TimeZone.getTimeZone(timezoneId));
        System.out.println("time fo device in android "+cl.getTime());
    }
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

11 votes

Quel service appelez-vous ? Et avez-vous vraiment vous voulez partager vos clés avec nous ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X