2012-02-06 11 views
5

मैं जानना चाहता था कि किसी दिए गए दिनांक के लिए दी गई तिथि सीमा के लिए समय क्षेत्र ऑफ़सेट प्राप्त करने का कोई तरीका है या नहीं।किसी दिए गए अवधि के लिए दो टाइमज़ोन के बीच समय क्षेत्र ऑफ़सेट प्राप्त करें

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    ...missing magic to go here... 
} 

को समय क्षेत्र ऑफसेट वापस करना चाहिए जो किसी दिए गए अवधि के लिए मान्य है। हालांकि अगर ऑफ़सेट बदल जाता है, तो उसे उस दिनांक सीमा को वापस कर देना चाहिए जिसके लिए यह मान्य है।

इस

timezoneoffset[0]["range"]=[march 9 12am to march 11 2 am] 
timezoneoffset[0]["offset"]=5 
timezoneoffset[1]["range"]=[march 9 2 am to march 15 12 am] 
timezoneoffset[1]["offset"]=4 

तरह

getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC", "US/NEW_YORK") 

वापसी मान कुछ मैं सिर्फ दी गई श्रेणी में हर अनुसूचित आइटम के लिए समय क्षेत्र ऑफसेट गणना करने के लिए नहीं करना चाहती:

तो मैं कुछ इस तरह से देख रहा हूँ । अगर यह बदलने जा रहा है तो ऑफ़सेट के लिए सीधा लुकअप पाने का कोई तरीका है या नहीं।

मैं PHP के साथ काम कर रहा हूं, लेकिन किसी भी भाषा में समाधान की सराहना की जाएगी।

MySQL समाधान भी काम करेगा क्योंकि यह MySQL में ऐसा करने के लिए अधिक अनुकूलित होगा।

उत्तर

3

मान लें कि आपके पास PHP का एक नया संस्करण है (5.2.0+) DateTimeZone कक्षा PHP कोर का हिस्सा है और आपको इन गणनाओं को बनाने के लिए getOffset() फ़ंक्शन का उपयोग करने देगी। यह आपको dateTime object में पास करने देगा और एक टाइमज़ोन निर्दिष्ट करेगा। यदि आप अपनी तिथियों के लिए ऐसा करते हैं तो आप उन सभी टुकड़ों की गणना करने में सक्षम होना चाहिए जिन्हें आप पकड़ना चाहते हैं। php.net से एक उदाहरण का उपयोग करें:

// Create two timezone objects, one for Taipei (Taiwan) and one for 
// Tokyo (Japan) 
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei"); 
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo"); 

// Create two DateTime objects that will contain the same Unix timestamp, but 
// have different timezones attached to them. 
$dateTimeTaipei = new DateTime(mktime([the date in question]), $dateTimeZoneTaipei); 
$dateTimeJapan = new DateTime(mktime([the date in question]), $dateTimeZoneJapan); 


// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei 
// object, but using the timezone rules as defined for Tokyo 
// ($dateTimeZoneJapan). 
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei); 

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST). 
print("Number of seconds Japan is ahead of GMT at the specific time: "); 
var_dump($timeOffset); 

print("<br />Number of seconds Taipei is ahead of GMT at the specific time: "); 
var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 

print("<br />Number of seconds Japan is ahead of Taipei at the specific time: "); 
var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei) 
    -$dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 
+0

मुझे ऑफसेट होने के बारे में पता है .. लेकिन ऑफसेट प्राप्त करें बस आपको किसी दिए गए समय के लिए ऑफ़सेट देता है .. बात यह है कि मेरे पास दिन के दौरान अलग-अलग समय के लिए शेड्यूल आइटम शेड्यूल के साथ एक शेड्यूल है .. – user1192612

+0

तो अगर मुझे कोई अनुरोध मिलता है 10 मार्च 2012 9 बजे टॉम 11 मार्च 9 बजे के बीच शेड्यूल आइटम प्राप्त करने के लिए ऑफसेट बीटी अवधि के लिए अलग-अलग होने जा रहा है .. मैं हर समय ऑफसेट की गणना करने के लिए तैयार नहीं हूं .. और यह सिर्फ अमेरिका के लिए है .. अलग-अलग देशों के अलग-अलग होंगे ऑफसेट जब ऑफसेट बदलते हैं, .. और मैं अवधि के एक सेट के लिए दो टाइमज़ोन के बीच ऑफ़सेट खोजने की कोशिश कर रहा हूं, यूटीसी जरूरी नहीं है .. समस्या यह है कि अगर मैं शुरुआत के आधार पर ऑफसेट की गणना करता हूं तो यह समस्या नहीं होगी .. मुझे लगता है कि पीएचपी आपको किसी दिए गए समय के लिए ऑफ़सेट देता है .. मुझे उम्मीद है कि मैंने खुद को स्पष्ट कर दिया है – user1192612

+0

नीचे मुझे लगता है कि ऑफसेट एक दिन के दौरान भिन्न हो सकता है मार्च 11 12 बजे टी ओ मैच 11 12 बजे (ऑफसेट 2 बजे बदलता है) .. मैं इस कोने के मामले को कवर करने की कोशिश कर रहा हूं – user1192612

1

मुझे लगता है कि PHP के DateTimeZone::getTransitions method तुम वहाँ मिल सकती है। इसमें एक प्रक्रियात्मक उपनाम है, timezone_transitions_get()

public array DateTimeZone::getTransitions (
    [ int $timestamp_begin [, int $timestamp_end ]] ) 

इस विधि एक निश्चित समय सीमा में है कि समय-क्षेत्र के लिए सभी देता है एक समय क्षेत्र ऑफसेट मूल्य से दूसरे में "बदलाव",,।

अपने उद्देश्यों के लिए, यदि आप संक्रमण के दो सरणियों अपने समय क्षेत्रों से प्रत्येक के लिए DateTimeZone वस्तुओं को बनाने के अपने समय अवधि के लिए DateTimeZone::getTransitions फोन उस समय क्षेत्र के लिए संक्रमण की एक सरणी प्राप्त करने के लिए, तो विलय और सॉर्ट चाहते है। यह आपको timezoneoffset[] सरणी के बराबर देगा जो आप चाहते हैं।

कुछ की तरह:

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    DT1 = DateTimeZone(timezone1); 
    transitions1 = DT1->getTransitions(startDate,endDate); 
    DT2 = DateTimeZone(timezone2); 
    transitions1 = DT2->getTransitions(startDate,endDate); 
    timezoneoffset[] = // merge and sort (transitions1, transitions2) 
} 

बदलाव सरणी के प्रारूप अच्छी तरह से प्रलेखित नहीं है।

Array 
(
... 
    [1] => Array 
     (
      [ts] => -1691964000 
      [time] => 1916-05-21T02:00:00+0000 
      [offset] => 3600 
      [isdst] => 1 
      [abbr] => BST 
     ) 

    [2] => Array 
     (
      [ts] => -1680472800 
      [time] => 1916-10-01T02:00:00+0000 
      [offset] => 0 
      [isdst] => 
      [abbr] => GMT 
     ) 
    ... 
) 

मुझे लगता है कि अटकलें: विधि दस्तावेज़ कुछ उदाहरण प्रविष्टियों से पता चलता के रूप में time() द्वारा दिया, कुछ ही समय में तत्काल देने ts युग सेकंड में एक PHP टाइमस्टैम्प को संदर्भित करता है, जिस पर इस रिकॉर्ड में मूल्य के लिए ऑफसेट परिवर्तन । time उसी स्वरूप को संदर्भित करता है, स्वरूपित स्ट्रिंग दिनांक-समय के रूप में। offset यूटीसी से सेकंड में टाइमज़ोन ऑफसेट है, तत्काल time/ts के अनुसार, अगले संक्रमण के लिए आगे। isdst 1 है यदि ऑफ़सेट एक डेलाइट बचत समय ऑफसेट को संदर्भित करता है, 0 अन्यथा। abbr समय क्षेत्र के लिए एक स्ट्रिंग संक्षेप है।अगर किसी के पास इस डेटा संरचना के बारे में ठोस जानकारी है, तो इसे the documentation में जोड़ने की कृपा होगी।

+0

धन्यवाद जिम .. ठीक है जो मैं देख रहा था .. मैं डेटाटाइम ऑब्जेक्ट के माध्यम से चला गया लेकिन यह अनदेखा हो गया। – user1192612

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