2009-10-19 10 views
12

पीएचपी में, आप बता सकते हैं कि किसी दिए गए दिनांक कुछ इस तरह का उपयोग करके डेलाइट सेविंग टाइम अवधि के दौरान यह है:कैसे बताएं कि क्या टाइमज़ोन वर्ष के किसी भी समय डेलाइट सेविंग को देखता है?

$isDST = date("I", $myDate); // 1 or 0 

समस्या यह है कि यह केवल आपको बतलाता है कि उस समय में एक बिंदु डीएसटी में है। क्या उस समय क्षेत्र में किसी भी समय डीएसटी प्रभावी है या नहीं, यह जांचने का एक विश्वसनीय तरीका है? स्पष्ट करने के लिए


संपादित करें:

  • ब्रिस्बेन, ऑस्ट्रेलिया साल के किसी भी समय डेलाइट सेविंग का पालन नहीं करता। पूरे साल, यह जीएमटी +10 है।
  • सिडनी, ऑस्ट्रेलिया अक्टूबर से मार्च तक करता है जब यह जीएमटी +10 से जीएमटी +11 में बदल जाता है।

अगर वहाँ कुछ मौजूदा विधि, या एक तरीका है जिसके इस तरह के रूप में काम करता लागू करने के लिए एक तरीका होगा मैं सोच रहा हूँ:

timezoneDoesDST('Australia/Brisbane'); // false 
timezoneDoesDST('Australia/Sydney'); // true 
+0

के साथ करते हैं, मुझे समझ में नहीं आता कि आप क्या चाहते हैं। क्या आप किसी भी तरह से सवाल फिर से लिख सकते हैं? या शायद कुछ उदाहरण दे? मुझे नहीं पता। –

+0

डीएसटी के संबंध में ये ऑस्ट्रेलिया अजीब हैं (कोई अपराध नहीं है): http://www.bcl.com.au/times-daylight-saving.htm –

+0

हाँ, यहां तक ​​कि एक राजनीतिक पार्टी भी है जिसका एकमात्र नीति डेलाइट बचत शुरू करना है दक्षिण पूर्व क्वींसलैंड में ... – nickf

उत्तर

14

मैं एक तरीका है जिसके PHP के DateTimezone वर्ग (PHP 5.2+)

function timezoneDoesDST($tzId) { 
    $tz = new DateTimeZone($tzId); 
    $trans = $tz->getTransitions(); 
    return ((count($trans) && $trans[count($trans) - 1]['ts'] > time())); 
} 

या, PHP का उपयोग करता है, तो आप चला रहे हैं 5.3+

function timezoneDoesDST($tzId) { 
    $tz = new DateTimeZone($tzId); 
    return count($tz->getTransitions(time())) > 0; 
} 

getTransitions() समारोह आप देता है काम करता मिल गया है टाइम टाइम के लिए ऑफ़सेट बदलते समय हर बार जानकारी। इसमें ऐतिहासिक डेटा (ब्रिस्बेन में 1 9 16 में डेलाइट बचत थी .. कौन जानता था?), इसलिए यह फ़ंक्शन जांचता है कि भविष्य में ऑफसेट परिवर्तन है या नहीं।

0

मुझे ऐसा नहीं लगता है, लेकिन लगभग हर देश के बाद से है कि डीएसटी पूरे मौसम या दो के लिए अपना समय बदलता है, आप किसी दिए गए वर्ष के दौरान 4 अंकों का परीक्षण करने का प्रयास कर सकते हैं।

उदाहरण के लिए, 2009/01/01, 200 9, 200 9, 200 9/07/01 और 200 9/10/01 के लिए date("I", $date) का परीक्षण करें। यदि वह टाइमज़ोन डीएसटी में पड़ता है, तो उनमें से कम से कम एक तारीख वापस आ जाएगी 1.

3

DateTimeZone::getTransitions मदद कर सकता है। शायद यह विंग

आप किए जा सकेंगे:

$hasDst = date("I", strtotime('June 1')) !== date("I", strtotime('Jan 1')); 

नहीं तो आप पाठ आधारित zoneinfo डेटा फ़ाइलों को पार्स करने के लिए आवश्यकता होगी।

10

असल nickf विधि मेरे लिए काम करता है तो मैं यह थोड़ा ...

/** 
* Finds wherever a TZ is experimenting dst or not 
* @author hertzel Armengol <emudojo @ gmail.com> 
* @params string TimeZone -> US/Pacific for example 
* 
*/ 
function timezoneExhibitsDST($tzId) { 
    $tz = new DateTimeZone($tzId); 
    $date = new DateTime("now",$tz); 
    $trans = $tz->getTransitions(); 
    foreach ($trans as $k => $t) 
     if ($t["ts"] > $date->format('U')) { 
      return $trans[$k-1]['isdst'];  
    } 
} 

// Usage 

var_dump(timezoneExhibitsDST("US/Pacific")); --> prints false 
var_dump(timezoneExhibitsDST("Europe/London")); --> prints false 
var_dump(timezoneExhibitsDST("America/Chicago")); --> prints false 

एक ही समारोह कॉल 1 महीने में सही वापस आ जाएगी (मार्च) पर फिर से काम नहीं किया था आशा है कि यह मदद करता है

+0

अद्भुत, धन्यवाद –

+0

सही जवाब, जयकार – dlofrodloh

0

तिथि है इसके लिए उपयोगकर्ता/सर्वर टाइमज़ोन पर काम करने के लिए, और आप दिनांक के साथ एक सीमा का उपयोग नहीं कर सकते हैं जैसा कि आप getTransitions

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