433 Stimmen

Wie man eine Zeitzone aus einem bestimmten Ort mithilfe von Breiten- und Längengradkoordinaten erhält?

Bei gegebenen Breiten- und Längengraden eines Ortes, wie erfährt man, welche Zeitzone in diesem Ort gültig ist?

In den meisten Fällen suchen wir nach einer IANA/Olson-Zeitzone-ID, obwohl einige Dienste nur einen UTC-Offset oder einen anderen Zeitzonenbezeichner zurückgeben können. Bitte lesen Sie die Zeitzone-Taginformationen für Details.

0voto

Stone Punkte 2508

Für diejenigen von uns, die Javascript verwenden und über die Google APIs eine Zeitzone anhand einer Postleitzahl erhalten möchten, hier ist eine Methode.

  1. Holen Sie sich die Breite/Länge über Geolokalisierung
  2. Holen Sie sich die Zeitzone, indem Sie diese in die Zeitzone-API übergeben.
    • Verwenden von Luxon hier für die Zeitzonenkonvertierung.

Hinweis: Meines Wissens sind Postleitzahlen nicht in allen Ländern eindeutig, daher ist dies wahrscheinlich am besten für die Verwendung in den USA geeignet.

const googleMapsClient; // instanzieren Sie hier Ihren Client
const postcode = '90210'
const meinDatumDasEiner Zeitzoneanpassung bedarf; // definieren Sie Ihr Datum, das angepasst werden muss
// Breite/Länge von google api nach Postleitzahl abrufen
const geocodeResponse = await googleMapsClient.geocode({ address: postcode }).asPromise();
if (geocodeResponse.json.status === 'OK') {
  lat = geocodeResponse.json.results[0].geometry.location.lat;
  lng = geocodeResponse.json.results[0].geometry.location.lng;
} else {
  console.log('Geocode war aus folgendem Grund nicht erfolgreich: ' + status);
}

// Breite/Länge und Zeitstempel des Profils erstellt_am für die Zeitzoneberechnung vorbereiten
const ort = `${lat},${lng}`;
const zeitstempel = new Date().valueOf() / 1000;
const timezoneResponse = await googleMapsClient
  .timezone({ location: ort, timestamp: zeitstempel })
  .asPromise();

const zeitzoneId = timezoneResponse.json.timeZoneId;
// Anpassen durch Einstellen der Zeitzone
const zeitzoneAngepasstesDatum = DateTime.fromJSDate(
  meinDatumDasEiner Zeitzoneanpassung bedarf
).setZone(zeitzoneId);

0voto

Tinien Punkte 55

https://de.wikipedia.org/wiki/Großkreisentfernung

Und hier ist eine gute Implementierung unter Verwendung von JSON-Daten: 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());
    }
}

0voto

gpuser Punkte 1109

Indem Sie Breitengrad und Längengrad verwenden, erhalten Sie die Zeitzone des aktuellen Standorts. Der folgende Code hat bei mir funktioniert:

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("Letzter bekannter Standort des Geräts == "+lat+" "+lng);

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

    URL url = new URL(timezoneurl);
    // Eine http-Verbindung erstellen, um mit der URL zu kommunizieren
    urlConnection = (HttpURLConnection) url.openConnection();

    // Mit URL verbinden
    urlConnection.connect();

    // Daten von URL lesen
    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("Ausnahme beim Herunterladen der 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("Zeitzonen-ID in Android == "+timezoneId);

        System.out.println("Zeitzone des Geräts in Android == "+TimeZone.getTimeZone(timezoneId));
        System.out.println("Zeit des Geräts in Android "+cl.getTime());
    }
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

0voto

Ingo Punkte 5017

Wenn Sie geonames.org verwenden möchten, verwenden Sie diesen Code. (Aber geonames.org ist manchmal sehr langsam)

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

`Und verwenden Sie es mit:

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

0voto

Ingo Punkte 5017

Ok, hier ist die kurze Version ohne korrekte NTP-Zeit:

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×tamp=1331161200&sensor=false

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

        String xmltext = get_xml_server_reponse(request);

        if(xmltext.compareTo("")!= 0)
        {

         int startpos = xmltext.indexOf("

`Und nutzen Sie es so:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X