2012-08-05 28 views
13

पर आपके लिए एक सिर स्क्रैचर कनवर्ट करें।यूटीसी ऑफसेट को टाइमज़ोन या दिनांक

मैं IPInfoDB के एपीआई से भू आईपी डेटा हथियाने रहा हूँ और यह एक समय क्षेत्र यूटीसी डीएसटी सहित से ऑफसेट रिटर्न (यदि वर्तमान में परिलक्षित)।

उदाहरण के लिए, मैं ईएसटी (-5) में रहता हूं और वर्तमान में यह डीएसटी है, इसलिए भू-आईपी एपीआई ऑफसेट के रूप में भू-आईपी एपीआई रिटर्न (-04:00) देता है।

यह अद्भुत है क्योंकि डीएसटी एक उग्र सिरदर्द है। लेकिन मेरे आश्चर्य के लिए, यह एक और सिरदर्द का कारण बन गया।

मैं इस डेटा को PHP में AJAX के माध्यम से आवेदन करने के लिए लोड करता हूं। मैं ऐप पर आईपी पते का लाइव स्थानीय समय लेना चाहता हूं।

मेरे पास यह सब ठीक से सेट है, लेकिन मैं ऑफसेट से मेल खाने के लिए PHP टाइमज़ोन को सेट करने का तरीका जानने के लिए पागल हो रहा हूं, इसलिए मैं AJAX के माध्यम से पास करने के लिए वर्तमान समय date('H'); और मिनट date('i'); को पकड़ सकता हूं।

मुझे यकीन नहीं है कि कोई विशिष्ट कार्य है जो मुझे उस ऑफसेट के आधार पर वर्तमान घंटे और मिनट दे सकता है या ऑफसेट के आधार पर टाइमज़ोन सेट करने का व्यावहारिक तरीका है (जो डीएसटी पहले ही लागू होगा प्रभाव में है)।

मैं Google को खोज रहा हूं और Google को खोज रहा हूं, लेकिन मैं जो कर रहा हूं वह अधिक विशिष्ट है क्योंकि डीएसटी पहले ही लागू हो चुका है।

मुझे PHP.net पर एक फ़ंक्शन मिला जो कि यह चाल करता है (यह मेरे टाइमज़ोन के लिए काम करता है और सही समय देता है) हालांकि पीएसटी जैसे अन्य टाइमज़ोन के लिए, यह ऑफसेट होने के बावजूद 1 घंटे बाद लौटा रहा है सही (-07:00 डीएसटी के साथ)।

फ़ंक्शन से लौटा गया टाइमज़ोन Chile/EasterIsland है जो मुझे लगता है कि यह कारण है। अगर मैं कर सकता, तो मैं संयुक्त राज्य अमेरिका के लिए यह एकमात्र काम करता हूं, लेकिन मुझे इसे दुनिया भर में करने की आवश्यकता है।

यह अब मेरे पास है। अत्यधिक गन्दा कोड क्षमा करें। मैं समाधान को समझने की कोशिश कर रहे पिछले कुछ घंटों में कई चीजों के साथ खेल रहा हूं।

अधिकांश कार्यक्षमता ऑनलाइन मिलीं।

function offsetToTZ($offset) { 
switch((string) $offset) { 
    case '-04:30' : return 'America/Caracas'; break; 
    case '-03:30' : return 'Canada/Newfoundland'; break; 
    case '+03:30' : return 'Asia/Tehran'; break; 
    case '+04:30' : return 'Asia/Kabul'; break; 
    case '+05:30' : return 'Asia/Kolkata'; break; 
    case '+05:45' : return 'Asia/Kathmandu'; break; 
    case '+09:30' : return 'Australia/Darwin'; break; 
} 
$offset = (int) str_replace(array('0',0,':00',00,'30',30,'45',45,':','+'),'', (string) $offset); 

$offset = $offset*60*60; 
$abbrarray = timezone_abbreviations_list(); 
foreach ($abbrarray as $abbr) { 
    foreach($abbr as $city) { 
     if($city['offset'] == $offset) { 
      return $city['timezone_id']; 
     } 
    } 
} 
return false; 
} 

मैं कुछ समय क्षेत्रों कि :30 और :45 वहाँ बाहर हैं के लिए स्विच/मामले शामिल थे। स्विच/केस की आवश्यकता के बिना भी शामिल करने का एक तरीका हो सकता है।

नोट: ऑफसेट हमेशा भू आईपी एपीआई से इस तरह के +00:00 या -00:00 रूप में वापस आ रहे हैं।

मैं किसी भी मदद या सही दिशा में एक बिंदु की सराहना करता हूं। मैं PHP के साथ बहुत नौसिखिया नहीं हूं, लेकिन ऑफसेट मेरे लिए एक नई कहानी है। धन्यवाद!

उत्तर

42

यह काफी बस किया जा सकता है, सेकंड में ऑफसेट मोड़ और timezone_name_from_abbr करने के लिए इसे पारित करके:

<?php 
$offset = '-7:00'; 

// Calculate seconds from offset 
list($hours, $minutes) = explode(':', $offset); 
$seconds = $hours * 60 * 60 + $minutes * 60; 
// Get timezone name from seconds 
$tz = timezone_name_from_abbr('', $seconds, 1); 
// Workaround for bug #44780 
if($tz === false) $tz = timezone_name_from_abbr('', $seconds, 0); 
// Set timezone 
date_default_timezone_set($tz); 

echo $tz . ': ' . date('r'); 

Demo

timezone_name_from_abbr नियंत्रण के तीसरे पैरामीटर डेलाइट बचत समय या नहीं करने के लिए समायोजित करने के लिए है कि क्या ।

Bug #44780:

timezone_name_from_abbr() कुछ समय क्षेत्र ऑफसेट पर अवास्तविक लौटाते हैं। विशेष रूप से - हवाई, जिसमें जीएमटी ऑफ़सेट से -10 है, -36000 सेकेंड।

संदर्भ:

+0

यह वह चीज है जिसे मैं ढूंढ रहा था। ऐसा लगता है कि यह ठीक काम करेगा, लेकिन मुझे कुछ समय लेना होगा और इसका परीक्षण करना होगा। किसी भी तरह से, आप उस निकटतम समाधान वाले व्यक्ति हैं जिन्हें मैं ढूंढ रहा था। मैं आपकी मदद की सराहना करता हूं और आपने बक्षीस अर्जित किया है :) –

+1

सावधान रहें, एक बग है: https://bugs.php.net/bug.php?id=44780 –

+0

@ होन्ज़ा जैवोरिक दिलचस्प, मुझे लगता है कि यह निश्चित है क्योंकि स्थान डेलाइट सेविंग के लिए समायोजित नहीं करते हैं। मुझे लगता है कि मुझे इसके लिए एक समाधान मिला है, हालांकि। –

1

आप DateTime PHP एक्सटेंशन (यह & को सभी PHP संस्करणों> = 5.2.0 में डिफ़ॉल्ट रूप से शामिल किया गया है, जब तक इसे संकलित समय पर विशेष रूप से अक्षम नहीं किया गया हो)।

यह सब कुछ आपको यहां बहुत अच्छी तरह से करता है।

4
date_default_timezone_set('UTC'); 

$timezones = array(); 
foreach (DateTimeZone::listAbbreviations() as $key => $array) 
{ 
    $timezones = array_merge($timezones, $array); 
} 

$utc    = new DateTimeZone('UTC'); 
$timezone_offset = '+02:00'; # 2H 
$sign    = substr($timezone_offset, 0, 1) == '+'? '': '-'; 
$offset    = substr($timezone_offset, 1, 2) . 'H' . substr($timezone_offset, 4, 2) . 'M'; 

$operation = $sign == ''? 'add': 'sub'; 

$start = new DateTime('', $utc); 
$date = new DateTime('', $utc); 

$date->{$operation}(new DateInterval("PT{$offset}")); 

$offset = $start->diff($date)->format('%r') . ($start->diff($date)->h * 3600 + $start->diff($date)->m * 60 + $start->diff($date)->s); # 7200 (2H) 

echo $offset, PHP_EOL; 
echo $date->format('Y-m-d H:i:s'), PHP_EOL; 

foreach($timezones as $timezone) 
{ 
    if($timezone['offset'] == $offset) 
    { 
     echo $timezone['timezone_id'], PHP_EOL; 
    } 
} 

मैं कुछ भागों में आप गलत समझा हो सकता है, लेकिन मुझे आशा है कि यह, मदद करता है अगर आप अधिक विशिष्ट हो सकता है, मैं और अधिक उपयोगी हो सकता है।

चिली के लिए मैं मिलता है: ऊपर के उदाहरण के

-25200 (-7h) 
2012-08-07 18:05:24 (current time 2012-08-08 01:05:24) 
Chile/EasterIsland 

आउटपुट:

7200 
2012-08-08 02:49:56 
Europe/London 
Europe/Belfast 
Europe/Gibraltar 
Europe/Guernsey 
Europe/Isle_of_Man 
Europe/Jersey 
GB 
Africa/Khartoum 
Africa/Blantyre 
Africa/Bujumbura 
Africa/Gaborone 
Africa/Harare 
Africa/Kigali 
Africa/Lubumbashi 
Africa/Lusaka 
Africa/Maputo 
Africa/Windhoek 
Europe/Berlin 
Africa/Algiers 
Africa/Ceuta 
Africa/Tripoli 
Africa/Tunis 
Arctic/Longyearbyen 
Atlantic/Jan_Mayen 
CET 
Europe/Amsterdam 
Europe/Andorra 
Europe/Athens 
Europe/Belgrade 
Europe/Bratislava 
Europe/Brussels 
Europe/Budapest 
Europe/Chisinau 
Europe/Copenhagen 
Europe/Gibraltar 
Europe/Kaliningrad 
Europe/Kiev 
Europe/Lisbon 
Europe/Ljubljana 
Europe/Luxembourg 
Europe/Madrid 
Europe/Malta 
Europe/Minsk 
Europe/Monaco 
Europe/Oslo 
Europe/Paris 
Europe/Podgorica 
Europe/Prague 
Europe/Riga 
Europe/Rome 
Europe/San_Marino 
Europe/Sarajevo 
Europe/Simferopol 
Europe/Skopje 
Europe/Sofia 
Europe/Stockholm 
Europe/Tallinn 
Europe/Tirane 
Europe/Tiraspol 
Europe/Uzhgorod 
Europe/Vaduz 
Europe/Vatican 
Europe/Vienna 
Europe/Vilnius 
Europe/Warsaw 
Europe/Zagreb 
Europe/Zaporozhye 
Europe/Zurich 
WET 
Europe/Kaliningrad 
Europe/Helsinki 
Africa/Cairo 
Africa/Tripoli 
Asia/Amman 
Asia/Beirut 
Asia/Damascus 
Asia/Gaza 
Asia/Istanbul 
Asia/Nicosia 
EET 
Europe/Athens 
Europe/Bucharest 
Europe/Chisinau 
Europe/Istanbul 
Europe/Kaliningrad 
Europe/Kiev 
Europe/Mariehamn 
Europe/Minsk 
Europe/Moscow 
Europe/Nicosia 
Europe/Riga 
Europe/Simferopol 
Europe/Sofia 
Europe/Tallinn 
Europe/Tiraspol 
Europe/Uzhgorod 
Europe/Vilnius 
Europe/Warsaw 
Europe/Zaporozhye 
Asia/Jerusalem 
Asia/Gaza 
Asia/Tel_Aviv 
MET 
Africa/Johannesburg 
Africa/Maseru 
Africa/Mbabane 
Africa/Windhoek 
Africa/Windhoek 
Africa/Ndjamena 
Europe/Lisbon 
Europe/Madrid 
Europe/Monaco 
Europe/Paris 
WET 
Europe/Luxembourg 

कौन सा नाखून मेरी समयक्षेत्र।

+0

आप जो कुछ खोज रहे थे उससे थोड़ा दूर हैं लेकिन यह एक व्यवहार्य समाधान है, मुझे विश्वास है कि यह थोड़ा अधिक इंजीनियर है जितना होना चाहिए। हालांकि मैं मदद की सराहना करता हूं। –

+0

@ बिगरोस कुछ पेय के बाद कोड नहीं है :))) खुशी है कि आपने समस्या हल कर ली है। चीयर्स। –

1

यह समय क्षेत्र मैप करने के लिए बिना परामर्श है वापस एक समय क्षेत्र पहचानकर्ता के लिए ऑफसेट। कई बार जोन एक ही ऑफ़सेट साझा करते हैं।

यहां तक ​​कि एक ही देश में, यह समस्याग्रस्त है। गौर करें कि संयुक्त राज्य अमेरिका में, -5 ऑफसेट का उपयोग केंद्रीय मानक समय (America/Chicago) और पूर्वी डेलाइट टाइम (America/New_York) दोनों वर्ष के विभिन्न समयों द्वारा किया जाता है।

यह भी मानते हैं कि ऐसे समय होते हैं जहां दोनों समय क्षेत्र उपयोग करते हैं -5 एक ही समय में। उदाहरण के लिए, यूटीसी -5 में रविवार नवंबर 3 2013 पूर्वाह्न 1:00 बजे या तो सीडीटी या ईएसटी में हो सकता है। आपके पास -5 द्वारा समय-समय पर अंतर करने का कोई तरीका नहीं होगा।

Details here.

0

तुम भी GMT समय का उपयोग करें और यह आपकी आवश्यकता के लिए कनवर्ट बाद में

<?php 
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998)); 
?> 

जीएमटी संदर्भित करता है ग्रीनविच मीन टाइम जो पूरी दुनिया में आम है सकते हैं।

3
$UTC_offset = '+03:00'; 
$date  = new \DateTime('now', 'UTC'); 
var_dump($date); 
$timezone = new \DateTimeZone(str_replace(':', '', $UTC_offset)); 
$date->setTimezone($timezone); 
var_dump($date); 

परिणाम:

class DateTime#205 (3) { 
    public $date => 
    string(26) "2015-01-20 06:00:00.000000" 
    public $timezone_type => 
    int(3) 
    public $timezone => 
    string(3) "UTC" 
} 
class DateTime#205 (3) { 
    public $date => 
    string(26) "2015-01-20 09:00:00.000000" 
    public $timezone_type => 
    int(1) 
    public $timezone => 
    string(6) "+03:00" 
} 
0

आजकल DateTimeZone निर्माता स्पष्ट रूप से एक यूटीसी ऑफसेट स्वीकार कर, जो मैं तुम्हें समझ में नहीं है।

तो बस:

$timeZone = new DateTimeZone('+0100'); 

प्रलेखन:

http://php.net/manual/en/datetimezone.construct.php

नोट: कि दस्तावेज़ीकरण लिंक प्रति, इस नए निर्माता उपयोग PHP संस्करण 5.5.10 बाद से उपलब्ध है।

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

  • कोई संबंधित समस्या नहीं^_^