วิธีรับโซนเวลาจากสถานที่โดยใช้พิกัดละติจูดและลองจิจูด?


310

มีคำถามมากมายใน StackOverflow เกี่ยวกับการแก้ไขเขตเวลาจากสถานที่ วิกิชุมชนนี้เป็นความพยายามในการรวมการตอบกลับที่ถูกต้องทั้งหมด

โปรดอัปเดตคำตอบของฉันหรือเพิ่มของคุณเองตามที่เห็นสมควร

คำถาม
จากละติจูดและลองจิจูดของสถานที่ใครจะรู้ได้อย่างไรว่าเขตเวลาใดมีผลในที่ตั้งนั้น

ในกรณีส่วนใหญ่เรากำลังมองหารหัสเขตเวลาของ IANA / Olson แม้ว่าบริการบางอย่างอาจส่งคืนเฉพาะเวลาออฟเซ็ต UTC หรือตัวระบุเขตเวลาอื่น ๆ โปรดอ่านข้อมูลแท็กเขตเวลาสำหรับรายละเอียด


2
สิ่งหนึ่งที่ฉันสังเกตเห็นคือการขาดข้อกำหนดการประทับเวลา UTC ใด ๆ เมื่อกำหนดเขตเวลา ตัวอย่างเช่นยาว / lat ในลอนดอนไม่เพียงพอที่จะกำหนดสภาพอากาศโซนเวลาคือ GMT หรือ BST (การประหยัดเวลาฤดูร้อน / เวลากลางวันของอังกฤษ) ดังนั้นเพื่อกำหนดเขตเวลาที่ถูกต้องคุณต้อง lat, long และ UTC timestamp
น้ำตกไมเคิล

4
@MichaelWaterfall - เพื่อตรวจสอบว่าคุณอยู่ใน GMT (UTC + 0000) หรือ BST (UTC + 0100) - ใช่คุณถูกต้องอย่างแน่นอน แต่สิ่งเหล่านี้เป็นการชดเชยเขตเวลาไม่ใช่ตัวระบุเขตเวลา ทั้งสองได้รับการครอบคลุมโดย"Europe/London"ตัวระบุเขตเวลาเดียวกันของฐานข้อมูลเขตเวลาของ IANA
Matt Johnson-Pint

โอเคและการชดเชยการประหยัดเวลากลางวันจะถูกเพิ่ม (หากจำเป็น) เมื่อแสดงเวลาด้วยตัวระบุเขตเวลาที่กำหนด
Michael Waterfall

@Michael - ขึ้นอยู่กับการใช้งานเฉพาะ แต่โดยปกติแล้วใช่
Matt Johnson-Pint

1
มันอาจยังต้องใช้เวลาประทับ UTC ตัวอย่างเช่นรัสเซียเปลี่ยนเขตเวลา 4 ครั้งในช่วง 6 ปีที่ผ่านมา en.wikipedia.org/wiki/Time_in_Russia
Arnial

คำตอบ:


421

บริการเว็บที่ตั้งโซนเวลา

เขตแดนข้อมูลเขตเวลาดิบ

โครงการต่อไปนี้เคยเป็นแหล่งข้อมูลขอบเขตเขตเวลา แต่ไม่ได้รับการดูแลรักษาอีกต่อไป

การใช้งานออฟไลน์ระบุตำแหน่งทางภูมิศาสตร์ในโซนเวลา

การใช้งานที่ใช้ข้อมูลตัวสร้างเขตเวลา

การใช้งานที่ใช้ข้อมูล tz_world ที่เก่ากว่า

ไลบรารีที่เรียกหนึ่งในเว็บเซอร์วิส

  • timezone - ทับทิมอัญมณีที่เรียกใช้ GeoNames
  • AskGeoมีห้องสมุดของตนเองสำหรับการโทรจาก Java หรือ. Net
  • GeoNamesมีห้องสมุดลูกค้าสำหรับทุกสิ่ง

บริการเว็บที่โฮสต์ด้วยตนเอง

ความคิดอื่น ๆ

โปรดอัปเดตรายการนี้หากคุณรู้จักผู้อื่น

นอกจากนี้โปรดทราบว่าวิธีการในเมืองที่ใกล้ที่สุดอาจไม่ให้ผลลัพธ์ "ถูกต้อง" ซึ่งเป็นเพียงการประมาณ

การแปลงเป็น Windows Zones

วิธีการส่วนใหญ่ที่แสดงจะส่งคืนรหัสเขตเวลาของ IANA หากคุณต้องการแปลงเป็นเขตเวลาของ Windows เพื่อใช้กับTimeZoneInfoคลาสใน. NET ให้ใช้ไลบรารีTimeZoneConverter

อย่าใช้ zone.tab

ฐานข้อมูล TZzone.tabรวมถึงไฟล์ที่เรียกว่า ไฟล์นี้ใช้สำหรับแสดงรายการของเขตเวลาเพื่อให้ผู้ใช้เลือก ซึ่งจะรวมถึงพิกัดละติจูดและลองจิจูดสำหรับจุดอ้างอิงสำหรับแต่ละเขตเวลา สิ่งนี้ทำให้แผนที่ถูกสร้างขึ้นเพื่อเน้นจุดเหล่านี้ ตัวอย่างเช่นดูแผนที่แบบโต้ตอบที่แสดงบนหน้าแรกของช่วงเวลา-เขตเวลา

ในขณะที่มันอาจดึงดูดให้ใช้ข้อมูลนี้เพื่อแก้ไขเขตเวลาจากพิกัดละติจูดและลองจิจูดให้พิจารณาว่าสิ่งเหล่านี้เป็นจุดไม่ใช่ขอบเขต สิ่งที่ดีที่สุดที่สามารถทำได้คือการกำหนดที่ใกล้เคียงที่สุดจุดที่ซึ่งในหลายกรณีจะไม่เป็นจุดที่ถูกต้อง

ลองพิจารณาตัวอย่างต่อไปนี้:

                            เขตเวลาตัวอย่างศิลปะ

สี่เหลี่ยมสองช่องแสดงเขตเวลาที่แตกต่างกันโดยที่จุดสีดำในแต่ละตารางเป็นที่ตั้งอ้างอิงเช่นสิ่งที่สามารถพบได้ใน zone.tab จุดสีฟ้าแสดงถึงตำแหน่งที่เราพยายามค้นหาเขตเวลา เห็นได้ชัดว่าตำแหน่งนี้อยู่ในโซนสีส้มด้านซ้าย แต่ถ้าเราดูระยะทางที่ใกล้ที่สุดไปยังจุดอ้างอิงมันจะแก้ไขไปยังโซนสีเขียวทางด้านขวา


1
GeoNames นั้นสมบูรณ์แบบสำหรับสิ่งที่ฉันต้องการ ขอบคุณ!
ลุค

1
@Matt แต่ที่ฉันเข้าใจในขณะนี้ยังไม่มีฐานข้อมูลออฟไลน์ที่จะให้ข้อมูลเขตเวลาและชดเชยจาก UTC ตามพิกัดตำแหน่ง?
Martin

@MattJohnson ฉันจะใช้ไลบรารีไคลเอนต์ geonames ได้อย่างไร
Erum

นี่คือรายการที่ยอดเยี่ยมขอบคุณ! Google ดูเหมือนตัวเลือกที่ชัดเจน แต่ฉันรู้สึกประหลาดใจที่พบว่าพวกเขาบอกฉันว่าลอนดอนอยู่ใน GMT ในความเป็นจริงแล้วใน BST ในขณะนี้ สำหรับนิวยอร์กมันมีการปรับฤดูร้อนที่ถูกต้อง
lewis

8
อัตรา Google API ใหม่เหล่านี้มีการบิดเบือน 200 คำขอราคา $ 1 ตั้งแต่ 7/18 นั่นคือการเพิ่มขึ้น 10 เท่า
Chris Lukic


8

พวกเราที่Teleportเพิ่งเริ่มเปิด API ของเราและหนึ่งในนั้นก็คือการเปิดเผยข้อมูล TZ สำหรับพิกัด

ตัวอย่างหนึ่งสามารถร้องขอข้อมูล 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สำหรับการแยกวิเคราะห์ JSON


2
ขอบคุณสำหรับการแบ่งปัน. มันใช้วิธีเข้าใกล้เมืองมากที่สุดหรือคุณใช้วิธีการแบบจุดในรูปหลายเหลี่ยม? (ดูแผนภาพของฉันที่มีสองช่องด้านบน)
Matt Johnson-Pint

3

นี่คือวิธีที่คุณสามารถใช้โปรแกรมแก้ไขสคริปต์ของ Google เพื่อรับชื่อเขตและ timeZoneId ในแผ่นงาน

ขั้นตอนที่ 1 รับรหัส APIสำหรับ API เขตเวลาของ Google

ขั้นตอนที่ 2 สร้าง gsheet ใหม่ ใต้เมนู 'เครื่องมือ' คลิก 'ตัวแก้ไขสคริปต์' เพิ่มรหัสต่อไปนี้:

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()ฟังก์ชันของคุณและใช้ตามที่แสดงในภาพด้านบน


2

คุณสามารถใช้geolocator.jsเพื่อรับเขตเวลาและอื่น ๆ ...

มันใช้ Google APIs ที่ต้องการรหัส ดังนั้นก่อนอื่นคุณควรกำหนดค่าตัวระบุตำแหน่งทางภูมิศาสตร์:

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 และอีกมากมาย

หากคุณไม่มีพิกัดคุณสามารถค้นหาตำแหน่งผู้ใช้ก่อน

ตัวอย่างด้านล่างจะลองใช้ HTML5 Geolocation API ก่อนเพื่อรับพิกัด หากล้มเหลวหรือถูกปฏิเสธก็จะได้รับพิกัดผ่านการค้นหา Geo-IP ในที่สุดมันจะได้รับเขตเวลาและอื่น ๆ ...

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
}

1

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

คุณสามารถเพิ่มเนื้อหาบางส่วนจากลิงก์ได้หรือไม่
Robert

1

การเปิดเผยข้อมูล: ฉันเป็นผู้สร้างภาพนักเทียบท่าที่อธิบายไว้ด้านล่าง

ฉันได้ห่อhttps://github.com/evansiroky/node-geo-tzไว้ในตัวเชื่อมต่อคอนเทนเนอร์ที่เรียบง่ายมาก

https://hub.docker.com/repository/docker/tobias74/timezone-lookup

คุณสามารถเริ่มต้นนักเทียบท่าคอนเทนเนอร์ด้วย

docker run -p 80:3000 tobias74/timezone-lookup:latest

นี่จะเป็นการเปิดเผยบริการค้นหาบนโลคัลโฮสต์ของคุณบนพอร์ต 3000 จากนั้นคุณสามารถทำการค้นหาตามเขตเวลาได้

curl "localhost:3000/timezone?latitude=12&longitude=34"

0

ลองใช้รหัสนี้เพื่อใช้ Google Time Zone API จาก Java กับไคลเอนต์ NTP เวลาปัจจุบันและแก้ไข UTC_Datetime_from_timestamp UTC:

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;

}

และใช้กับ:

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

1
ดูเหมือนว่ารหัสจำนวนมากสำหรับงานง่าย ๆ คุณมีไคลเอนต์ NTP เต็มรูปแบบในนั้นซึ่งอาจเป็นความคิดที่ดี - แต่ไม่จำเป็นต้องทำ กรุณาทำให้ผอมลงหน่อยได้ไหม?
Matt Johnson-Pint

0

ตกลงที่นี่เป็นเวอร์ชั่นย่อที่ไม่มีเวลา 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("<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;

}

และใช้กับ:

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

0

หากคุณต้องการใช้ 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("<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;

 }

และใช้กับ:

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

0

จาก 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

วิธีการที่ถูกผูกไว้America/Anchorage.dstของDstTzInfo

อเมริกา / แองเคอเรจ 'LMT-1 วัน, 14:00:00 น


ฉันคิดว่า Guppy เป็นตัวพิมพ์ผิด คุณหมายถึงGeopyหรืออย่างอื่นหรือ
Matt Johnson-Pint

0

เป็นเรื่องสำคัญที่จะต้องตระหนักว่านี่เป็นปัญหาที่ซับซ้อนกว่าคนส่วนใหญ่ที่สงสัย ในทางปฏิบัติพวกเราหลายคนยินดีที่จะยอมรับชุดโค้ดที่ใช้งานได้สำหรับ "ให้มากที่สุดเท่าที่จะเป็นไปได้" ซึ่งอย่างน้อยปัญหาร้ายแรงของมันสามารถระบุและย่อเล็กสุดได้โดยรวม ดังนั้นฉันจึงโพสต์สิ่งนี้ด้วยสิ่งเหล่านี้และจิตวิญญาณของ 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)

ขอบคุณ แต่ดูเหมือนว่ารหัสบางส่วนที่ใช้pytzwhereซึ่งมีอยู่แล้วในคำตอบของชุมชนหลัก wiki หากคุณตั้งใจจะให้ตัวอย่างของวิธีการรวม pytzwhere กับ pytz คุณอาจต้องการส่งสิ่งนั้นในฐานะ PR ไปยังโครงการ pytzwhere ที่นี่เรากำลังมองหาโซลูชั่น lat / lon to tz ซึ่ง pytzwhere เป็นหนึ่งในนั้น
Matt Johnson-Pint

0
  1. มีหลายแหล่งออนไลน์ที่มีข้อมูล GeoJSON สำหรับเขตเวลาที่อยู่ ( ที่นี่เป็นหนึ่ง , นี่เป็นอื่น)

  2. ใช้ไลบรารีรูปทรงเรขาคณิตเพื่อสร้างวัตถุรูปหลายเหลี่ยมจากพิกัด geojson ( รูปงูหลาม, 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
    

0

โดยใช้ละติจูดและลองจิจูดรับโซนเวลาของตำแหน่งปัจจุบันด้านล่างโค้ดทำงานให้ฉัน

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

11
คุณกำลังใช้บริการใดอยู่ และทำคุณจริงๆต้องการที่จะแบ่งปันคีย์ของคุณกับเรา ??
Matt Johnson-Pint

0

สำหรับพวกเราที่ใช้ Javascript และต้องการหาเขตเวลาจากรหัสไปรษณีย์ผ่าน Google APIนี่เป็นวิธีหนึ่ง

  1. ดึงละติจูด / ลองจิจูดผ่านตำแหน่งทางภูมิศาสตร์
  2. ดึงข้อมูลเขตเวลาโดยผ่านที่เข้ามาในเขตเวลา API
    • ใช้Luxonที่นี่สำหรับการแปลงเขตเวลา

หมายเหตุ: ความเข้าใจของฉันคือรหัสไปรษณีย์ไม่ซ้ำกันในแต่ละประเทศดังนั้นจึงเหมาะสำหรับใช้ในสหรัฐอเมริกา

const googleMapsClient; // instantiate your client here
const zipcode = '90210'
const myDateThatNeedsTZAdjustment; // define your date that needs adjusting
// fetch lat/lng from google api by zipcode
const geocodeResponse = await googleMapsClient.geocode({ address: zipcode }).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 was not successful for the following reason: ' + status);
}

// prepare lat/lng and timestamp of profile created_at to fetch time zone
const location = `${lat},${lng}`;
const timestamp = new Date().valueOf() / 1000;
const timezoneResponse = await googleMapsClient
  .timezone({ location: location, timestamp: timestamp })
  .asPromise();

const timeZoneId = timezoneResponse.json.timeZoneId;
// adjust by setting timezone
const timezoneAdjustedDate = DateTime.fromJSDate(
  myDateThatNeedsTZAdjustment
).setZone(timeZoneId);

-2

  function jsonpRequest(url, data)
{
    let params = "";
    for (let key in data)
    {
        if (data.hasOwnProperty(key))
        {
            if (params.length == 0)
            {
                params += "?";
            }
            else
            {
                params += "&";
            }
            let encodedKey = encodeURIComponent(key);
            let encodedValue = encodeURIComponent(data[key]);
            params += encodedKey + "=" + encodedValue;
         }
    }
    let script = document.createElement('script');
    script.src = url + params;
    document.body.appendChild(script);
}

function getLocation() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(showPosition);
  } else {
    x.innerHTML = "Geolocation is not supported by this browser.";
  }
}
let lat_ini=[]; let lon_ini=[];
function showPosition(position) {
  lat_ini= position.coords.latitude;
  lon_ini= position.coords.longitude;
}
////delay time between lines
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
///////
function getGMT()
{
  getfinalGMT()
  getLocation()
  async function sample() {
    await sleep(2000);
let lat_str=lat_ini.toString();
let lng_str=" "+lon_ini.toString();

  let url = "https://api.opencagedata.com/geocode/v1/json";
  let data = {
    callback: "displayGMT",
    q: lat_str + lng_str,
    key: "fac4471073a347019196c1291e6a97d7"
  }
  jsonpRequest(url, data)
}
 sample();
 }
let your_GMT=[];
function displayGMT(data)
{
your_GMT=(Number(data.results[0].annotations.timezone.offset_string))
console.log(your_GMT)
}
/////
function getfinalGMT()
{
let lat=document.getElementById("lat_id").value; let lng=document.getElementById("lng_id").value;
let lat_str=lat.toString();
let lng_str=" "+lng.toString();

  let url = "https://api.opencagedata.com/geocode/v1/json";
  let data = {
    callback: "displayfinalGMT",
    q: lat + lng_str,
    key: "fac4471073a347019196c1291e6a97d7"
  }
  jsonpRequest(url, data)
 }
let final_GMT=[];
function displayfinalGMT(data)
{
final_GMT=(Number(data.results[0].annotations.timezone.offset_string))
console.log(final_GMT)
}
/////clock


const hourHand = document.querySelector('[data-hour-hand]')
const minuteHand = document.querySelector('[data-minute-hand]')
const secondHand = document.querySelector('[data-second-hand]')
  let dif_overall=[];
function setClock() {
   let gmt_diff=Number(your_GMT-final_GMT)/100
   if (gmt_diff>12){
      dif_overall=gmt_diff-12
   }
   else{
     dif_overall=gmt_diff
   }
    console.log(dif_overall)
  const currentDate = new Date()
  const secondsRatio = currentDate.getSeconds() / 60
  const minutesRatio = (secondsRatio + currentDate.getMinutes()) / 60
  const hoursRatio = (minutesRatio + currentDate.getHours() - dif_overall ) / 12
  setRotation(secondHand, secondsRatio)
  setRotation(minuteHand, minutesRatio)
  setRotation(hourHand, hoursRatio)
}

function setRotation(element, rotationRatio) {
  element.style.setProperty('--rotation', rotationRatio * 360)
}
function activate_clock(){
setClock()
setInterval(setClock, 1000)
}
*, *::after, *::before {
  box-sizing: border-box;
}

body {
  background: linear-gradient(to right, hsl(200, 100%, 50%), hsl(175, 100%, 50%));
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  overflow: hidden;
}

.clock {
  width: 200px;
  height: 200px;
  background-color: rgba(255, 255, 255, .8);
  border-radius: 50%;
  border: 2px solid black;
  position: relative;
}

.clock .number {
  --rotation: 0;
  position: absolute;
  width: 100%;
  height: 100%;
  text-align: center;
  transform: rotate(var(--rotation));
  font-size: 1.5rem;
}

.clock .number1 { --rotation: 30deg; }
.clock .number2 { --rotation: 60deg; }
.clock .number3 { --rotation: 90deg; }
.clock .number4 { --rotation: 120deg; }
.clock .number5 { --rotation: 150deg; }
.clock .number6 { --rotation: 180deg; }
.clock .number7 { --rotation: 210deg; }
.clock .number8 { --rotation: 240deg; }
.clock .number9 { --rotation: 270deg; }
.clock .number10 { --rotation: 300deg; }
.clock .number11 { --rotation: 330deg; }

.clock .hand {
  --rotation: 0;
  position: absolute;
  bottom: 50%;
  left: 50%;
  border: 1px solid white;
  border-top-left-radius: 10px;
  border-top-right-radius: 10px;
  transform-origin: bottom;
  z-index: 10;
  transform: translateX(-50%) rotate(calc(var(--rotation) * 1deg));
}

.clock::after {
  content: '';
  position: absolute;
  background-color: black;
  z-index: 11;
  width: 15px;
  height: 15px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  border-radius: 50%;
}

.clock .hand.second {
  width: 3px;
  height: 45%;
  background-color: red;
}

.clock .hand.minute {
  width: 7px;
  height: 40%;
  background-color: black;
}

.clock .hand.hour {
  width: 10px;
  height: 35%;
  background-color: black;
}














/* Background Styles Only */

@import url('https://fonts.googleapis.com/css?family=Raleway');

* {
    font-family: Raleway;
}

.side-links {
  position: absolute;
  top: 15px;
  right: 15px;
}

.side-link {
  display: flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
  margin-bottom: 10px;
  color: white;
  width: 180px;
  padding: 10px 0;
  border-radius: 10px;
}

.side-link-youtube {
  background-color: red;
}

.side-link-twitter {
  background-color: #1DA1F2;
}

.side-link-github {
  background-color: #6e5494;
}

.side-link-text {
  margin-left: 10px;
  font-size: 18px;
}

.side-link-icon {
  color: white;
  font-size: 30px;
}
   <input type="text" id="lat_id" placeholder="lat"><br><br>
  <input type="text" id="lng_id" placeholder="lng"><br><br>
<button class="text" onClick="getLocation()">Location</button>
<button class="text" onClick="getGMT()"> GMT</button>
<button class="text" onClick="activate_clock()"> Activate</button>
<div class="clock">
  <div class="hand hour" data-hour-hand></div>
  <div class="hand minute" data-minute-hand></div>
  <div class="hand second" data-second-hand></div>
  <div class="number number1">1</div>
  <div class="number number2">2</div>
  <div class="number number3">3</div>
  <div class="number number4">4</div>
  <div class="number number5">5</div>
  <div class="number number6">6</div>
  <div class="number number7">7</div>
  <div class="number number8">8</div>
  <div class="number number9">9</div>
  <div class="number number10">10</div>
  <div class="number number11">11</div>
  <div class="number number12">12</div>
</div>


พวกคุณจะต้องคัดลอกและวางรหัสลงในเบราว์เซอร์ใหม่เนื่องจากส่วนย่อยของโค้ดจะไม่อนุญาตให้เราแจ้งตำแหน่งของผู้ใช้
Maximus Su

หวังว่าพวกคุณจะชื่นชมมัน
Maximus Su

เมื่อป้อน lat และ lng ให้กดที่ตำแหน่ง GMT จากนั้นเปิดใช้งานนาฬิกา
Maximus Su

ฉันไม่คิดว่าคุณตั้งใจจะแบ่งปันคีย์ API ของคุณกับ opencagedata กับเราใช่ไหม แทนที่จะเป็นการทิ้งโค้ดคุณสามารถอธิบาย API นี้ได้
Matt Johnson-Pint

บางคนก็แค่ต้องเห็นตัวอย่างของฟังก์ชั่นการโทรกลับเพื่อ API เพื่อให้เข้าใจได้ดีขึ้น
Maximus Su

-3

หากคุณต้องการหลีกเลี่ยงบริการบนเว็บคุณสามารถดึงข้อมูลจากเบราว์เซอร์เช่นนี้:

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

หวังว่ามันจะเป็นประโยชน์


ในขณะที่ฉันขอขอบคุณที่คุณใส่ความพยายามบางอย่างในนี้โปรดตระหนักถึง: 1) โซนเวลาจะไม่คงที่ชดเชย 2) เวลาตัวย่อโซนไม่ได้มาตรฐานหรือตัวระบุที่ไม่ซ้ำกัน 3) นี้ได้ทำไปแล้วมากขึ้นอย่างถูกต้องกับjsTimeZoneDetect 4) คำตอบของคุณไม่ตรงกับคำถาม คำถามคือวิธีการตรวจสอบเขตเวลาจากพิกัดละติจูดและลองจิจูด
Matt Johnson-Pint
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.