usuario ubicacion tipos proceso posición poner obtener navegador longitud latitud hacer geolocalización geolocalizacion cómo con como calcula app geolocation timezone latitude-longitude

geolocation - tipos - obtener ubicacion navegador



¿Cómo obtener una zona horaria desde una ubicación utilizando las coordenadas de latitud y longitud? (14)

Hay demasiadas preguntas en StackOverflow sobre cómo resolver una zona horaria desde una ubicación. Esta wiki de la comunidad es un intento de consolidar todas las respuestas válidas.

Por favor actualice mi respuesta, o agregue la suya como mejor le parezca.

La pregunta
Dada la latitud y longitud de una ubicación, ¿cómo se puede saber qué zona horaria está vigente en esa ubicación?

En la mayoría de los casos, estamos buscando un ID de zona horaria de IANA / Olson, aunque algunos servicios pueden devolver solo un desplazamiento UTC o algún otro identificador de zona horaria. Por favor, lea la información de la etiqueta de zona horaria para más detalles.


  1. Hay varias fuentes en línea que tienen datos geojson para las zonas horarias ( whereonearth-timezone , here''s otra)

  2. Utilice una biblioteca de geometría para crear objetos de polígono a partir de las coordenadas geojson ( shapely [python], GEOS [c ++], JTS [java], NTS [.net]).

  3. Convierta su lat / lng en un objeto puntual (sin embargo, su biblioteca lo representa) y verifique si se cruza con el polígono de la zona horaria.

    from shapely.geometry import Polygon, Point def get_tz_from_lat_lng(lat, lng): for tz, geojson in timezones.iteritems(): coordinates = geojson[''features''][0][''geometry''][''coordinates''] polygon = Polygon(coordinates) point = Point(lng, lat) if polygon.contains(point): return tz


¿Qué le parece esta solución para node.js tzwhere

Y su contraparte de Python: pytzwhere


Aquí le mostramos cómo puede usar el editor de secuencias de comandos de Google para obtener el nombre de la zona horaria y la zona horaria dentro de un gsheet.

Paso 1. Obtenga una clave API para la API de zona horaria de Google

Paso 2. Crea un nuevo gsheet. Debajo del menú ''herramientas'' haga clic en ''editor de script''. Agregue el siguiente código:

function getTimezone(lat, long) { var apiKey = ''INSERTAPIKEYHERE'' var url = ''https://maps.googleapis.com/maps/api/timezone/json?location='' + lat + '','' + long + ''&timestamp=1331161200&key='' + apiKey var response = UrlFetchApp.fetch(url); var data = JSON.parse(response.getContentText()); return data["timeZoneName"]; }

Paso 3. Guarda y publica tu función getTimezone() y getTimezone() como se muestra en la imagen de arriba.


De Guppy:

import geocoders g = geocoders.GoogleV3() place, (lat, lng) = g.geocode(''Fairbanks'') print place, (lat, lng) Fairbanks, AK, USA (64.8377778, -147.7163889) timezone = g.timezone((lat, lng)) print timezone.dst

Método de DstTzInfo America/Anchorage.dst de DstTzInfo

América / Anchorage ''LMT-1 día, 14:00:00 STD


De hecho, es importante reconocer que este es un problema más complicado de lo que la mayoría sospecharía. En la práctica, muchos de nosotros también estamos dispuestos a aceptar un conjunto de código de trabajo que funcione para "tantos casos como sea posible", donde al menos sus problemas fatales se pueden identificar y minimizar de manera colectiva. Así que publico esto con todo eso y el espíritu del OP en mente. Finalmente, para obtener un valor práctico para otros que intentan convertir el GPS en la zona horaria con el objetivo final de tener un objeto de tiempo sensible a la ubicación (y, lo que es más importante, ayudar a mejorar la calidad de las implementaciones promedio con los objetos de tiempo que siguen de este wiki) Lo que generé en Python (por favor siéntase libre de editar):

import pytz from datetime import datetime from tzwhere import tzwhere def timezoned_unixtime(latitude, longitude, dt): tzw = tzwhere.tzwhere() timezone_str = tzw.tzNameAt(latitude, longitude) timezone = pytz.timezone(timezone_str) timezone_aware_datetime = timezone.localize(dt, is_dst=None) unix_time = (timezone_aware_datetime - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() return unix_time dt = datetime(year=2017, month=1, day=17, hour=12, minute=0, second=0) print timezoned_unixtime(latitude=40.747854, longitude=-74.004733, dt=dt)


Nosotros en Teleport comenzamos a abrir nuestras API y uno de los casos de uso también está exponiendo la información de TZ para las coordenadas.

Por ejemplo, uno podría solicitar toda nuestra información TZ disponible para las coordenadas de la siguiente manera:

curl -s https://api.teleport.org/api/locations/59.4372,24.7453/?embed=location:nearest-cities/location:nearest-city/city:timezone/tz:offsets-now | jq ''._embedded."location:nearest-cities"[0]._embedded."location:nearest-city"._embedded."city:timezone"''

Esto devolvería lo siguiente

{ "_embedded": { "tz:offsets-now": { "_links": { "self": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z" } }, "base_offset_min": 120, "dst_offset_min": 60, "end_time": "2015-10-25T01:00:00Z", "short_name": "EEST", "total_offset_min": 180, "transition_time": "2015-03-29T01:00:00Z" } }, "_links": { "self": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/" }, "tz:offsets": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/{?date}", "templated": true }, "tz:offsets-now": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z" } }, "iana_name": "Europe/Tallinn" }

Para el ejemplo utilicé ./jq para el análisis JSON.


Ok, aquí está la versión corta sin la hora NTP correcta:

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; }

Y utilízalo con:

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


Pruebe este código para usar la API de la zona horaria de Google desde Java con el actual cliente de tiempo NTP y la conversión correcta de UTC_Datetime_from_timestamp:

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; 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=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; erg = get_UTC_Datetime_from_timestamp(tsLong); } return erg; }

Y utilízalo con:

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


Puedes usar geolocator.js para obtener fácilmente la zona horaria y más ...

Utiliza las API de Google que requieren una clave. Entonces, primero configuras el geolocalizador:

geolocator.config({ language: "en", google: { version: "3", key: "YOUR-GOOGLE-API-KEY" } });

Obtén TimeZone si tienes las coordenadas:

geolocator.getTimeZone(options, function (err, timezone) { console.log(err || timezone); });

Ejemplo de salida:

{ id: "Europe/Paris", name: "Central European Standard Time", abbr: "CEST", dstOffset: 0, rawOffset: 3600, timestamp: 1455733120 }

Localiza luego obtén TimeZone y más

Si no tiene las coordenadas, puede ubicar primero la posición del usuario.

El siguiente ejemplo probará primero la API de geolocalización HTML5 para obtener las coordenadas. Si falla o es rechazado, obtendrá las coordenadas a través de la búsqueda de Geo-IP. Finalmente, obtendrá la zona horaria y más ...

var options = { enableHighAccuracy: true, timeout: 6000, maximumAge: 0, desiredAccuracy: 30, fallbackToIP: true, // if HTML5 fails or rejected addressLookup: true, // this will get full address information timezone: true, map: "my-map" // this will even create a map for you }; geolocator.locate(options, function (err, location) { console.log(err || location); });

Ejemplo de salida:

{ coords: { latitude: 37.4224764, longitude: -122.0842499, accuracy: 30, altitude: null, altitudeAccuracy: null, heading: null, speed: null }, address: { commonName: "", street: "Amphitheatre Pkwy", route: "Amphitheatre Pkwy", streetNumber: "1600", neighborhood: "", town: "", city: "Mountain View", region: "Santa Clara County", state: "California", stateCode: "CA", postalCode: "94043", country: "United States", countryCode: "US" }, formattedAddress: "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA", type: "ROOFTOP", placeId: "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", timezone: { id: "America/Los_Angeles", name: "Pacific Standard Time", abbr: "PST", dstOffset: 0, rawOffset: -28800 }, flag: "//cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/flags/4x3/us.svg", map: { element: HTMLElement, instance: Object, // google.maps.Map marker: Object, // google.maps.Marker infoWindow: Object, // google.maps.InfoWindow options: Object // map options }, timestamp: 1456795956380 }


Si prefiere evitar un servicio web, puede recuperar esa información del navegador de esta manera:

var d = new Date(); var usertime = d.toLocaleString(); //some browsers / OSs provide the timezone name in their local string var tzsregex = //b(ACDT|ACST|ACT|ADT|AEDT|AEST|AFT|AKDT|AKST|AMST|AMT|ART|AST|AWDT|AWST|AZOST|AZT|BDT|BIOT|BIT|BOT|BRT|BST|BTT|CAT|CCT|CDT|CEDT|CEST|CET|CHADT|CHAST|CIST|CKT|CLST|CLT|COST|COT|CST|CT|CVT|CXT|CHST|DFT|EAST|EAT|ECT|EDT|EEDT|EEST|EET|EST|FJT|FKST|FKT|GALT|GET|GFT|GILT|GIT|GMT|GST|GYT|HADT|HAEC|HAST|HKT|HMT|HST|ICT|IDT|IRKT|IRST|IST|JST|KRAT|KST|LHST|LINT|MART|MAGT|MDT|MET|MEST|MIT|MSD|MSK|MST|MUT|MYT|NDT|NFT|NPT|NST|NT|NZDT|NZST|OMST|PDT|PETT|PHOT|PKT|PST|RET|SAMT|SAST|SBT|SCT|SGT|SLT|SST|TAHT|THA|UYST|UYT|VET|VLAT|WAT|WEDT|WEST|WET|WST|YAKT|YEKT)/b/gi; //in other browsers the timezone needs to be estimated based on the offset var timezonenames = {"UTC+0":"GMT","UTC+1":"CET","UTC+2":"EET","UTC+3":"EEDT","UTC+3.5":"IRST","UTC+4":"MSD","UTC+4.5":"AFT","UTC+5":"PKT","UTC+5.5":"IST","UTC+6":"BST","UTC+6.5":"MST","UTC+7":"THA","UTC+8":"AWST","UTC+9":"AWDT","UTC+9.5":"ACST","UTC+10":"AEST","UTC+10.5":"ACDT","UTC+11":"AEDT","UTC+11.5":"NFT","UTC+12":"NZST","UTC-1":"AZOST","UTC-2":"GST","UTC-3":"BRT","UTC-3.5":"NST","UTC-4":"CLT","UTC-4.5":"VET","UTC-5":"EST","UTC-6":"CST","UTC-7":"MST","UTC-8":"PST","UTC-9":"AKST","UTC-9.5":"MIT","UTC-10":"HST","UTC-11":"SST","UTC-12":"BIT"}; var timezone = usertime.match(tzsregex); if (timezone) { timezone = timezone[timezone.length-1]; } else { var offset = -1*d.getTimezoneOffset()/60; offset = "UTC" + (offset >= 0 ? "+" + offset : offset); timezone = timezonenames[offset]; } //there are 3 variables can use to see the timezone // usertime - full date // offset - UTC offset time // timezone - country console.log(''Full Date: '' + usertime); console.log(''UTC Offset: '' + offset); console.log(''Country Code Timezone: '' + timezone);

En mi caso actual se está imprimiendo:

Fecha completa: 27/01/2014 16: 53: 37 Compensación UTC : UTC-3 Código del país Zona horaria: BRT

Espero que pueda ser de ayuda.


Si quieres usar geonames.org entonces usa este código. (Pero geonames.org es muy lento a veces)

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; }

Y utilízalo con:

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


usando latitud y longitud, obtenga la zona horaria de la ubicación actual debajo del código que funcionó para mí

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(); }


https://en.wikipedia.org/wiki/Great-circle_distance

Y aquí hay una buena implementación utilizando datos JSON: https://github.com/agap/llttz

public TimeZone nearestTimeZone(Location node) { double bestDistance = Double.MAX_VALUE; Location bestGuess = timeZones.get(0); for (Location current : timeZones.subList(1, timeZones.size())) { double newDistance = distanceInKilometers(node, current); if (newDistance < bestDistance) { bestDistance = newDistance; bestGuess = current; } } return java.util.TimeZone.getTimeZone(bestGuess.getZone()); } protected double distanceInKilometers(final double latFrom, final double lonFrom, final double latTo, final double lonTo) { final double meridianLength = 111.1; return meridianLength * centralAngle(latFrom, lonFrom, latTo, lonTo); } protected double centralAngle(final Location from, final Location to) { return centralAngle(from.getLatitude(), from.getLongitude(), to.getLatitude(), to.getLongitude()); } protected double centralAngle(final double latFrom, final double lonFrom, final double latTo, final double lonTo) { final double latFromRad = toRadians(latFrom), lonFromRad = toRadians(lonFrom), latToRad = toRadians(latTo), lonToRad = toRadians(lonTo); final double centralAngle = toDegrees(acos(sin(latFromRad) * sin(latToRad) + cos(latFromRad) * cos(latToRad) * cos(lonToRad - lonFromRad))); return centralAngle <= 180.0 ? centralAngle : (360.0 - centralAngle); } protected double distanceInKilometers(final Location from, final Location to) { return distanceInKilometers(from.getLatitude(), from.getLongitude(), to.getLatitude(), to.getLongitude()); } }


Servicios web de ubicación de zona horaria

Datos de límite de zona horaria sin procesar

  • Timezone Boundary Builder : crea shapefiles de zona horaria a partir de datos de mapas de OpenStreetMaps. Incluye las aguas territoriales cercanas a las costas.

Los siguientes proyectos han sido previamente fuentes de datos de límites de zona horaria, pero ya no se mantienen activamente.

Implementaciones fuera de línea de geolocalización de zona horaria

Implementaciones que utilizan los datos de Timezone Boundary Builder

Implementaciones que utilizan los datos más antiguos de tz_world.

Bibliotecas que llaman a uno de los servicios web.

  • timezone - gema de Ruby que llama GeoNames
  • AskGeo tiene sus propias bibliotecas para llamar desde Java o .Net
  • GeoNames tiene bibliotecas cliente para casi todo

Otras ideas

  • Encuentra la ciudad más cercana con un R-Tree
  • Encuentra la ciudad más cercana con MySQL

Por favor, actualice esta lista si conoce alguna otra.

Además, tenga en cuenta que el enfoque de la ciudad más cercana puede no producir el resultado "correcto", solo una aproximación.

Conversión a las zonas de Windows

La mayoría de los métodos enumerados devolverán un ID de zona horaria de IANA. Si necesita convertir a una zona horaria de Windows para usar con la clase TimeZoneInfo en .NET, use la biblioteca TimeZoneConverter .

No uses zone.tab

La base de datos tz incluye un archivo llamado zone.tab . Este archivo se usa principalmente para presentar una lista de zonas horarias para que un usuario elija. Incluye las coordenadas de latitud y longitud para el punto de referencia para cada zona horaria. Esto permite crear un mapa resaltando estos puntos. Por ejemplo, vea el mapa interactivo que se muestra en la página de inicio de la zona horaria .

Si bien puede ser tentador utilizar estos datos para resolver la zona horaria a partir de las coordenadas de latitud y longitud, tenga en cuenta que estos son puntos, no límites. Lo mejor que uno podría hacer sería determinar el punto más cercano, que en muchos casos no será el punto correcto.

Considere el siguiente ejemplo:

Los dos cuadrados representan diferentes zonas horarias, donde el punto negro en cada cuadrado es la ubicación de referencia, como lo que se puede encontrar en zone.tab. El punto azul representa la ubicación para la que intentamos encontrar una zona horaria. Claramente, esta ubicación está dentro de la zona naranja de la izquierda, pero si solo miramos la distancia más cercana al punto de referencia, se resolverá a la zona verdosa de la derecha.