2010-06-27 15 views
16

क्या उनके अक्षांश और देशांतर से उपयोगकर्ता का टाइमज़ोन मिलता है? और न सिर्फ ऑफसेट, लेकिन वास्तविक समय क्षेत्र वे कर रहे हैं।अक्षांश और देशांतर से PHP टाइमज़ोन नाम प्राप्त करें?

अनिवार्य रूप से, मैं जो एक निश्चित समय क्षेत्र के लिए अक्षांश और देशांतर रिटर्न DateTimeZone :: getLocation के ध्रुवीय विपरीत के लिए खोज कर रहा हूँ।

+0

हाँ यह था .. मैंने पहले geonames में देखा था, लेकिन जो मैं कह सकता था उससे वास्तविक टाइमज़ोन NAME नहीं दिया था। लड़का मैं गलत था और लड़का अब मुझे बेवकूफ लगता है। – Navarr

उत्तर

6

Geonames अच्छी तरह से काम करना चाहिए:

http://www.geonames.org/

वे भी एक php पुस्तकालय मिल गया है।

+3

भू-नाम अपने डेटाबेस में निकटतम रिकॉर्ड के लिए समय क्षेत्र पाता है। यदि वह समय क्षेत्र सीमा के दूसरी तरफ है, तो यह गलत होगा। –

-1

याहू स्थान एपीआई रिवर्स भौगोलिक स्थान के माध्यम से टाइमज़ोन जानकारी प्रदान करता है।

इसे देखें।

http://developer.yahoo.com/geo/placefinder/guide/requests.html

+0

याहू ने पिछले साल अपने जीपीएस उत्पादों का समर्थन करना बंद कर दिया और नोकिया को तकनीक का लाइसेंस दिया, न कि भविष्य के लिए सर्वोत्तम दृष्टिकोण वाले एक कंपनी, जब तक कि वे अपने माइक्रोसॉफ्ट लगाए गए विकास प्रमुख को आग नहीं देते और कंपनी के स्पंक से बाहर होने से पहले एंड्रॉइड बैंडवागोन में शामिल हो जाते हैं। –

-1

कैसे सभी समय क्षेत्र स्थानों की सूची में एक के सबसे करीब बिंदु खोजने के बारे में? मुझे आश्चर्य है कि यह कितना सटीक है?

अद्यतन: आखिरकार, मैं इस स्निपेट के साथ आया जो मेरे लिए काम करता है। यह सभी स्थानों के लिए ठीक काम करेगा, लेकिन सीमाओं के नजदीक उन लोगों के लिए सटीक नहीं हो सकता है।

/** 
    * Attempts to find the closest timezone by coordinates 
    * 
    * @static 
    * @param $lat 
    * @param $lng 
    */ 
    public static function getClosestTimezone($lat, $lng) 
    { 
    $diffs = array(); 
    foreach(DateTimeZone::listIdentifiers() as $timezoneID) { 
     $timezone = new DateTimeZone($timezoneID); 
     $location = $timezone->getLocation(); 
     $tLat = $location['latitude']; 
     $tLng = $location['longitude']; 
     $diffLat = abs($lat - $tLat); 
     $diffLng = abs($lng - $tLng); 
     $diff = $diffLat + $diffLng; 
     $diffs[$timezoneID] = $diff; 

    } 

    //asort($diffs); 
    $timezone = array_keys($diffs, min($diffs)); 


    return $timezone[0]; 

    } 
+5

यह बहुत गलत है, क्योंकि यह प्रत्येक समय क्षेत्र को एक अक्षांश और अक्षांश के रूप में मानता है। यह सीमाओं के नजदीक थोड़ा गलत नहीं होगा, यह दुनिया के विशाल क्षेत्रों में बहुत गलत होगा। –

+1

@ जेम्स डी, मैं मानता हूं कि यदि आप टाइमज़ोन पहचान के सटीक समाधान की आवश्यकता है तो आप इस समाधान पर भरोसा नहीं कर सकते हैं, लेकिन उपयोगकर्ता को अपने स्थान के सबसे नज़दीकी समय क्षेत्र की सूची में से चुनने का सुझाव देना बिल्कुल ठीक है। मुझे यह दृष्टिकोण टाइमज़ोन की एक विशाल सूची देने से बेहतर लगता है। – Dziamid

+0

टाइमज़ोन सख्ती से लैटलांग पर आधारित नहीं है, इसमें राजनीतिक विचार भी शामिल हैं। सिंगापुर हांगकांग के समान समय क्षेत्र में है, हालांकि यह हांगकांग के काफी पश्चिम में है, और यद्यपि यह जकार्ता के समानांतरता में है, यह जकार्ता से एक घंटा आगे है। एक टाइमज़ोन गणना को लापरवाही/लंबे समय तक मैप किए बिना कड़ाई से करने का प्रयास करना एक बुरा विचार है। – Shreeni

0

मैंने हाल ही में एक 8 घंटे लंबे हैकथॉन में टाइमज़ोन समाधान किया था। इसे जल्दी से एक साथ रखा गया है और मुझे इसे और विकसित करना अच्छा लगेगा और इसे एक उत्पाद के रूप में बेचना अच्छा लगेगा, लेकिन मेरे पास ऐसा करने का कोई तरीका नहीं है, इसलिए मैंने इसे my github पर खोला है।

demo भी है लेकिन यह संसाधन सीमाओं को हिट करने पर नीचे जा सकता है। यह Google App Engine पर एक निःशुल्क वेबपैप है।

आप निश्चित रूप से अपनी आवश्यकताओं के अनुसार wrt - running time, space, data - में इसे आगे बढ़ा सकते हैं/बढ़ा सकते हैं।

+0

क्या आपको प्रश्न में "PHP" याद आया? पाइथन पहले से उपलब्ध होने के लिए एक बेहतर समाधान है: https://github.com/MrMinimal64/timezonefinder – hackel

15

उन लोगों के लिए जो देश कोड, अक्षांश और देशांतर से टाइमज़ोन प्राप्त करना चाहते हैं। (यदि आपके सर्वर पर एक जियोप मॉड्यूल स्थापित है तो इसे प्राप्त करना आसान है)

इसे आज़माएं, मैंने दूरी गणना जोड़ दी है - केवल उन देशों के लिए जिनमें कई टाइमज़ोन हैं। आह, और देश कोड दो अक्षर आईएसओ कोड है।

// [email protected] 

function get_nearest_timezone($cur_lat, $cur_long, $country_code = '') { 
    $timezone_ids = ($country_code) ? DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $country_code) 
            : DateTimeZone::listIdentifiers(); 

    if($timezone_ids && is_array($timezone_ids) && isset($timezone_ids[0])) { 

     $time_zone = ''; 
     $tz_distance = 0; 

     //only one identifier? 
     if (count($timezone_ids) == 1) { 
      $time_zone = $timezone_ids[0]; 
     } else { 

      foreach($timezone_ids as $timezone_id) { 
       $timezone = new DateTimeZone($timezone_id); 
       $location = $timezone->getLocation(); 
       $tz_lat = $location['latitude']; 
       $tz_long = $location['longitude']; 

       $theta = $cur_long - $tz_long; 
       $distance = (sin(deg2rad($cur_lat)) * sin(deg2rad($tz_lat))) 
       + (cos(deg2rad($cur_lat)) * cos(deg2rad($tz_lat)) * cos(deg2rad($theta))); 
       $distance = acos($distance); 
       $distance = abs(rad2deg($distance)); 
       // echo '<br />'.$timezone_id.' '.$distance; 

       if (!$time_zone || $tz_distance > $distance) { 
        $time_zone = $timezone_id; 
        $tz_distance = $distance; 
       } 

      } 
     } 
     return $time_zone; 
    } 
    return 'unknown'; 
} 
//timezone for one NY co-ordinate 
echo get_nearest_timezone(40.772222,-74.164581) ; 
// more faster and accurate if you can pass the country code 
echo get_nearest_timezone(40.772222, -74.164581, 'US') ; 
+0

यह एक बेहतर उत्तर हो सकता है। मुझे कुछ परीक्षण करना होगा। देश कोड बिल्कुल क्यों? क्या ऐसे स्थान हैं जो कई देशों में हैं? – Navarr

+0

अच्छा समाधान। धन्यवाद। – ineersa

+0

ग्रेट, ... कुछ समय गलत समय क्षेत्र, लेकिन देश कोड के साथ उपयोग करते समय सटीक काम करता है – rushil

2

क्या गूगल समय क्षेत्र API के बारे में

https://developers.google.com/maps/documentation/timezone/

यह latitude और longitude लेता है और इस

array(
    'dstOffset' => (int) 3600, 
    'rawOffset' => (int) -18000, 
    'status' => 'OK', 
    'timeZoneId' => 'America/New_York', 
    'timeZoneName' => 'Eastern Daylight Time' 
) 

जैसी सरणी देता है लेकिन कुछ सीमाएँ हैं

Google टाइम जोन एपीआई में निम्न सीमाएं हैं:

मुफ्त API के उपयोगकर्ता:
प्रति 24 घंटे की अवधि के 2,500 अनुरोध।
प्रति सेकंड 10 अनुरोध।

व्यापार ग्राहकों के लिए मानचित्र:
प्रति 24 घंटे की अवधि के 100,000 अनुरोध।
प्रति सेकंड 10 अनुरोध।

संबंधित मुद्दे