Как получить часовой пояс из местоположения с использованием координат широты и долготы?

Слишком много вопросов о StackOverflow о разрешении часового пояса из местоположения. Эта вики сообщества – попытка консолидировать все действительные ответы.

Пожалуйста, обновите мой ответ или добавьте свои собственные, как вы сочтете нужным.

Вопрос
Учитывая широту и долготу местоположения, как узнать, какой часовой пояс действует в этом месте?

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

Веб-службы местоположения временной зоны

  • API часовых поясов Google Maps
  • API-интерфейс API Azure Maps от Microsoft
  • API временной зоны GeoNames
  • API TimeZoneDB
  • AskGeo – коммерческий (но, возможно, более точный, чем GeoNames )
  • GeoGarage Time Zone API – коммерческий, ориентированный на навигационные часовые пояса.

Граничные данные временной зоны

  • Timezone Boundary Builder – создает шейп-файлы часовых поясов из данных карты OpenStreetMaps. Включает в себя территориальные воды вблизи береговых линий.

Следующие проекты ранее являлись источниками данных о границах часовых поясов, но более активно не поддерживаются.

  • tz_world – исходные данные шейп- файла от Эрика Мюллера
  • whereonearth-timezone – версия GeoJSON с данными WOEDB, объединенными в

Часовой пояс Geolocation Offline Реализации

Реализации, которые используют данные TimeBound Bar Builder

  • node-geo-tz – библиотека JavaScript
  • tz-lookup – библиотека JavaScript
  • Библиотека GeoTimeZone – .NET
  • timezonefinder – библиотека Python
  • Библиотека ZoneDetect – C
  • Timeshape – библиотека Java

Реализации, в которых используются старые данные tz_world

  • Библиотека latlong – Go (прочитайте также этот пост .)
  • TimeZoneMapper – библиотека Java
  • tzwhere – библиотека JavaScript / Node
  • pytzwhere – библиотека Python
  • timezone_finder – библиотека Ruby
  • LatLongToTimeZone – библиотеки Java и Swift
  • Какое это время? – Сообщение в блоге, описывающее PHP и MongoDB

Библиотеки, которые называют одной из веб-служб

  • часовой пояс – Ruby gem, который вызывает GeoNames
  • AskGeo имеет свои собственные библиотеки для вызова с Java или .Net
  • GeoNames имеет клиентские библиотеки практически для всего

Другие идеи

  • Найдите ближайший город с R-Tree
  • Найти ближайший город с MySQL

Обновите этот список, если знаете какие-либо другие

Также обратите внимание, что подход ближайшего города не может дать «правильный» результат, просто приближение.

Преобразование в Windows Zones

Большинство перечисленных методов вернут идентификатор часового пояса IANA. Если вам нужно преобразовать в часовой пояс Windows для использования с classом TimeZoneInfo в .NET, используйте библиотеку TimeZoneConverter .

Не используйте zone.tab

База данных tz включает файл zone.tab . Этот файл в основном используется для представления списка часовых поясов для пользователя. Он включает координаты широты и долготы для точки отсчета для каждого часового пояса. Это позволяет создать карту, выделяя эти точки. Например, см. Интерактивную карту, показанную на домашней странице момента времени .

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

Рассмотрим следующий пример:

Пример использования часового пояса

Два квадрата представляют разные часовые пояса, где черная точка в каждом квадрате является ссылочным местоположением, например, что можно найти в zone.tab. Синяя точка представляет собой местоположение, в котором мы пытаемся найти часовой пояс. Очевидно, что это место находится в оранжевой зоне слева, но если мы просто посмотрим на ближайшее расстояние до контрольной точки, оно будет разрешено к зеленоватой зоне справа.

Как насчет этого решения для node.js https://github.com/mattbornski/tzwhere

И его коллега Python: https://github.com/pegler/pytzwhere

Мы в Teleport только начали открывать наши API, и одна из них также раскрывает информацию TZ для координат.

Например, можно запросить всю имеющуюся информацию о ТЗ для координат следующим образом:

 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"' 

Это вернет следующие

 { "_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" } 

Для примера я использовал ./jq для parsingа JSON.

Вы можете использовать geolocator.js для получения временной зоны и многое другое …

Он использует API Google, для которых требуется ключ. Итак, сначала настройте геолокатор:

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

Получите TimeZone, если у вас есть координаты:

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

Пример вывода:

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

Найдите, затем получите TimeZone и многое другое.

Если у вас нет координат, вы можете сначала найти позицию пользователя.

Пример, приведенный ниже, сначала попробует API-интерфейс HTML5 Geolocation для получения координат. Если он терпит неудачу или отклонен, он получит координаты через Geo-IP look-up. Наконец, он получит часовой пояс и многое другое …

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

Пример вывода:

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

Вот как вы можете использовать редактор сценариев Google, чтобы получить timezoneName и timeZoneId внутри gsheet.

Шаг 1. Получите ключ API для API часовых поясов Google.

Шаг 2. Создайте новый gsheet. В меню «tools» нажмите «Редактор сценариев». Добавьте следующий код:

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

Шаг 3. Сохраните и опубликуйте getTimezone() и используйте ее, как показано на изображении выше.

Хорошо, вот короткая версия без правильного времени NTP:

 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(" 

И используйте его с:

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

Если вы хотите использовать geonames.org, используйте этот код. (Но geonames.org очень медленный иногда)

 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(" 

И используйте его с:

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

используя широту и долготу, чтобы получить временную зону текущего местоположения ниже кода, работавшего для меня

 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"; //&key=AIzaSyDZMS5Za6yG_66gAK8PL_KH1ZSS9NbWC"; // timezoneurl = timezoneurl+"location="+lat+","+lng+"&timestamp=1331161200";//&key=AIzaSyDZMS5Za6yG_66gAK8PL_KH1ZSS9NbWCbg"; 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(); } 

Очень важно признать, что это будет более сложной проблемой, чем большинство подозреваемых. На практике многие из нас также готовы принять рабочий набор кода, который работает для «как можно большего числа случаев», где по крайней мере его фатальные проблемы могут быть идентифицированы и сведены к минимуму в совокупности. Поэтому я публикую это со всем этим и духом OP в виду. Наконец, для практической ценности для других, которые пытаются преобразовать GPS в часовой пояс с конечной целью иметь чувствительный к местоположению объект времени (и, что более важно, помочь повысить качество средних реализаций с объектами времени, которые следуют из этой вики), здесь то, что я сгенерировал в Python (не стесняйтесь редактировать):

 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) 
  1. Есть несколько источников в Интернете, которые имеют данные geojson для часовых поясов ( вот один , вот еще один)

  2. Используйте библиотеку геометрии для создания объектов многоугольника из координат геойсона ( стройный [python], GEOS [c ++], JTS [java], NTS [.net]).

  3. Преобразуйте lat / lng в точечный объект (однако ваша библиотека представляет это) и проверьте, пересекает ли он многоугольник часового пояса.

     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 

Попробуйте этот код для использования API часовых поясов Google из Java с текущим клиентом времени NTP и исправьте UTC_Datetime_from_timestamp convert:

 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(" - 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(" 

И используйте его с:

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

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

И вот хорошая реализация с использованием данных 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()); } } 

От Гуппи:

 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 

Связанный метод America/Anchorage.dst из DstTzInfo

Америка / Анкоридж ‘LMT-1 день, 14:00:00 STD

Если вы предпочитаете избегать веб-службы, вы можете получить эту информацию из браузера следующим образом:

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

В моем текущем случае это печать:

Полная дата: 27/01/2014 16: 53: 37 UTC Смещение: UTC-3 Код страны Часовой пояс: BRT

Надеюсь, это будет полезно.

  • R - Поиск ближайшей соседней точки и числа соседей в заданном радиусе, координаты lat-long
  • Расчет расстояния между двумя широтами и долготами GeoCoordinates
  • Какова максимальная длина широты и долготы?
  • Вычислить вторую точку, зная начальную точку и расстояние
  • Рассчитать расстояние в метрах, когда вы знаете долготу и широту в java
  • Interesting Posts

    группировка перетаскиваемых объектов с помощью jquery-ui draggable

    Пример Facebook Connect в JSP (tomcat)

    Импортирование узлов node_modules в Angular2 и TypeScript

    Ошибка: (23, 17) Не удалось выполнить: junit: junit: 4.12

    Могу ли я изменить Google Chrome, чтобы предсказать мой поиск, и мгновенно посетить первый результат?

    Каковы «измененные» и «резервные» области ОЗУ в Мониторе ресурсов?

    Как отключить окно «Оповещение безопасности» в элементе управления Webbrowser

    Существуют ли особые технические соображения, которые могут нанести ущерб компьютеру в режиме сна каждый раз?

    Управление указателем мыши с клавиатурой

    Вызов оператора присваивания в конструкторе копирования

    Как печатать указатели функций с помощью cout?

    Не удалось загрузить файл или сборку «System.Data.SQLite»

    Нежный учебник для Emacs / Swank / Paredit для Clojure

    Горизонтальная прокрутка сетки

    Неопределяемая графическая карта

    Давайте будем гением компьютера.