2011-11-30 25 views
9

Me gustaría saber la hora local a la que mi usuario está enviando su solicitud. Básicamente, ¿existe tal cosa como una función como estaPosición del GPS en la zona horaria

var localTime = getLocalTime(lat, long); 

no estoy seguro de si es una simple división en el lat podría funcionar, ya que la mayoría de los países no cuentan con formas geométricas perfectas.

Cualquier ayuda sería genial. Cualquier lenguaje es aceptado. Me gustaría evitar llamar a API distantes.

+0

Bueno, se trata de una API remota, pero échale un vistazo a la respuesta a esta pregunta. Puede darle lo que desea: http://stackoverflow.com/questions/41504/timezone-lookup-from-latitude-longitude. –

Respuesta

-3

¿No podría simplemente usar la IP del usuario para determinar en qué viven? Y luego usa una matriz de (Países | Diferencia con GMT) para obtener la hora local.

2

Estaba buscando lo mismo hace algunos días y, desafortunadamente, no pude encontrar una API o una función simple que lo hiciera. La razón es como dijiste que los países no tienen formas geométricas perfectas. Tienes que crear una representación del área de cada zona horaria y ver dónde está tu punto. Creo que esto será un dolor y no tengo idea de si se puede hacer en absoluto.

El único que encontré se describe aquí: Determine timezone from latitude/longitude without using web services like Geonames.org. Básicamente, necesitas una base de datos con información sobre husos horarios e intentas ver cuál está más cerca de tu punto de interés.

Sin embargo, estaba buscando soluciones estáticas (sin usar internet), así que si puedes usar la conexión a Internet puedes usar: http://www.earthtools.org/webservices.htm que proporciona un servicio web para darte las coordenadas de latitud y longitud de la zona horaria.

4

El Google Time Zone API parece ser lo que buscas.

La API de zona horaria proporciona datos de compensación de tiempo para ubicaciones en la superficie de la tierra. Solicitar la información de zona horaria para un par de Latitud/Longitud específico devolverá el nombre de esa zona horaria, el desfase horario de UTC y la compensación de Horario de verano.

3

Acabo de enfrentar el mismo problema hoy, y no estoy seguro de cuán relevante es mi respuesta después de todo este tiempo, pero básicamente escribí una función de Python que hace lo que quiere. Lo puedes encontrar aquí.

https://github.com/cstich/gpstotz

Editar:

Como se ha mencionado en los comentarios También debo Código postal. El código se basa en el shapefile de zonas horarias de Eric Muller, que puede obtener aquí: http://efele.net/maps/tz/world/.

Edición 2:

Como resulta que tienen una definición archivos de forma un tanto arcaica de los anillos exteriores e interiores (básicamente anillos exteriores están usando la regla de la mano derecha, mientras que los anillos interiores están usando la regla de la mano izquierda). En cualquier caso, fiona parece ocuparse de eso y actualicé el código en consecuencia.

from rtree import index # requires libspatialindex-c3.deb 
from shapely.geometry import Polygon 
from shapely.geometry import Point 

import os 
import fiona 

''' Read the world timezone shapefile ''' 
tzshpFN = os.path.join(os.path.dirname(__file__), 
        'resources/world/tz_world.shp') 

''' Build the geo-index ''' 
idx = index.Index() 
with fiona.open(tzshpFN) as shapes: 
    for i, shape in enumerate(shapes): 
     assert shape['geometry']['type'] == 'Polygon' 
     exterior = shape['geometry']['coordinates'][0] 
     interior = shape['geometry']['coordinates'][1:] 
     record = shape['properties']['TZID'] 
     poly = Polygon(exterior, interior) 
     idx.insert(i, poly.bounds, obj=(i, record, poly)) 


def gpsToTimezone(lat, lon): 
    ''' 
    For a pair of lat, lon coordiantes returns the appropriate timezone info. 
    If a point is on a timezone boundary, then this point is not within the 
    timezone as it is on the boundary. Does not deal with maritime points. 
    For a discussion of those see here: 
    http://efele.net/maps/tz/world/ 
    @lat: latitude 
    @lon: longitude 
    @return: Timezone info string 
    ''' 
    query = [n.object for n in idx.intersection((lon, lat, lon, lat), 
               objects=True)] 
    queryPoint = Point(lon, lat) 
    result = [q[1] for q in query 
       if q[2].contains(queryPoint)] 

    if len(result) > 0: 
     return result[0] 
    else: 
     return None 

if __name__ == "__main__": 
    ''' Tests ''' 
    assert gpsToTimezone(0, 0) is None # In the ocean somewhere 
    assert gpsToTimezone(51.50, 0.12) == 'Europe/London' 
+0

Debería publicar el código correspondiente aquí en lugar de requerir que las personas vayan fuera del sitio. Los enlaces a otros sitios pueden estar desactualizados y no pueden ser buscados por la función de búsqueda SO. –

+0

Eso tiene sentido, acaba de publicar el código. ¿Hay alguna forma de adjuntar archivos a una respuesta? – cstich

Cuestiones relacionadas