Положение GPS в часовом поясе

Я хотел бы знать местное время, откуда мой пользователь отправляет свой запрос. В принципе, существует ли такая функция, как эта

var localTime = getLocalTime( lat, long );

Я не уверен, что простое деление на широте сработает, поскольку в большинстве стран нет идеальных геометрических форм.

Любая помощь была бы замечательной. Принимается любой язык. Я бы не хотел вызывать удаленные API.


person Alex    schedule 30.11.2011    source источник
comment
Что ж, здесь задействован удаленный API, но взгляните на ответ на этот вопрос. Это может дать вам то, что вы хотите: stackoverflow.com/questions / 41504 /.   -  person Jonathan M    schedule 30.11.2011


Ответы (5)


Кажется, вам нужен Google Time Zone API. Однако у него нет уровня бесплатного пользования.

API часового пояса предоставляет данные о временном сдвиге для местоположений на поверхности Земли. Запрос информации о часовом поясе для конкретной пары широта / долгота вернет имя этого часового пояса, смещение времени от UTC и смещение перехода на летнее время.

person Josh Hunt    schedule 10.12.2013

Шейп-файл, используемый для вычисления часового пояса, больше не поддерживается.

Я столкнулся с той же проблемой сегодня, и я не уверен, насколько уместен мой ответ по прошествии всего этого времени, но я просто написал функцию Python, которая делает то, что вы хотите. Вы можете найти это здесь.

https://github.com/cstich/gpstotz

Редактировать:

Как упоминалось в комментариях, я также должен опубликовать код. Код основан на шейп-файле часовых поясов Эрика Мюллера, который вы можете получить здесь - http://efele.net/maps/tz/world/.

Изменить 2:

Как оказалось, шейп-файлы имеют несколько архаичное определение внешних и внутренних колец (в основном внешние кольца используют правило правой руки, а внутренние кольца используют правило левой руки). В любом случае, похоже, об этом позаботится Фиона, и я соответствующим образом обновил код.

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'
person cstich    schedule 25.05.2015
comment
Вы должны разместить здесь соответствующий код вместо того, чтобы требовать, чтобы люди уходили за пределы сайта. Ссылки на другие сайты могут устареть, и их нельзя будет найти с помощью функции поиска SO. - person Dour High Arch; 25.05.2015
comment
В этом есть смысл, просто выложил код. Есть ли способ прикрепить файлы к ответу? - person cstich; 26.05.2015

Я искал то же самое пару дней назад и, к сожалению, не смог найти API или простую функцию, которая это делает. Причина в том, что, как вы сказали, в странах нет идеальных геометрических форм. Вы должны создать представление области каждого часового пояса и увидеть, в чем заключается ваша точка зрения. Я думаю, что это будет неприятно, и я понятия не имею, можно ли это вообще сделать.

Единственный, который я нашел, описан здесь: Определить часовой пояс по широте / долготе без использования веб-сервисов, таких как Geonames.org. Обычно вам нужна база данных с информацией о часовых поясах, и вы пытаетесь определить, какой из них ближе всего к интересующей вас точке.

Однако я искал статические решения (без использования Интернета), поэтому, если вы можете использовать подключение к Интернету, вы можете использовать: http://www.earthtools.org/webservices.htm, который предоставляет веб-сервис для предоставления вам часового пояса с учетом координат широты и долготы.

person Petar    schedule 30.11.2011

По состоянию на 2019 год у Google API нет бесплатного уровня, и источник данных ответа @cstich больше не поддерживается.

Если вам нужен API, timezonedb.com предлагает уровень бесплатного пользования, ограниченный 1 запросом. /второй.

Первоначальный разработчик данных, используемых @cstich, ссылается на этот проект, который извлекает данные из OpenStreetMap. Файл readme содержит ссылку для поиска библиотек на самых разных языках.

person vwvw    schedule 30.04.2019

Не могли бы вы просто использовать IP-адрес пользователя, чтобы определить, где он живет? Затем вы используете массив (Страны | Разница с GMT), чтобы получить местное время.

person Jeremy67    schedule 30.11.2011