में टाइमज़ोन के बीच कनवर्ट करने की तारीखें मेरे पास एक केकेपीएचपी एप्लीकेशन है जो दो अलग-अलग डेटाबेस से डेटा खींच रहा है, जो विभिन्न समय-समय पर अपने डेटा में दिनांक और समय संग्रहीत करता है। एक डेटाबेस का टाइमज़ोन Europe/Berlin
है, और दूसरा Australia/Sydney
है। चीजों को और अधिक जटिल बनाने के लिए, एप्लिकेशन को यूएस में सर्वर पर होस्ट किया जाता है, और समय को अंतिम उपयोगकर्ता को अपने स्थानीय टाइमज़ोन में प्रस्तुत किया जाना चाहिए।AppModel-> afterFind (केकेपीएचपी)
यह कहना आसान हो जो डेटाबेस मैं पहुँच के लिए है काफी है, और इसलिए मैं अपने beforeFind
में उचित समय क्षेत्र (date_default_timezone_set()
का प्रयोग करके) सेट करें जिससे क्वेरी सही समय क्षेत्र में एक तारीख के साथ भेजा जाता है।
मेरी समस्या तब उपयोगकर्ता की टाइमज़ोन पर afterFind
में तिथियों को परिवर्तित कर रही है। मैं इस टाइमज़ोन को नामित पैरामीटर के माध्यम से गुजर रहा हूं, और मॉडल में इसका उपयोग करने के लिए मैं Configure::write()
और Configure.read()
का उपयोग कर रहा हूं। यह ठीक काम करता है।
समस्या यह है कि ऐसा लगता है कि यह मेरे टाइमज़ोन रूपांतरण को कई बार लागू कर रहा है। उदाहरण के लिए, यदि मैं Australia/Perth
से Australia/Sydney
डेटाबेस से पूछताछ कर रहा हूं तो समय दो घंटे पीछे होना चाहिए, लेकिन यह छह घंटे पीछे आ रहा है। मैंने उन्हें बदलने से पहले और बाद में अपने फ़ंक्शन से समय को प्रतिबिंबित करने का प्रयास किया, और प्रत्येक रूपांतरण सही ढंग से काम कर रहा था, लेकिन यह एक बार से अधिक बार परिवर्तित कर रहा था, और मैं यह नहीं समझ सकता कि क्यों।
तरीकों मैं वर्तमान में उपयोग कर रहा हूँ (मेरे AppModel
) एक समय क्षेत्र से कन्वर्ट करने के लिए के लिए एक और प्रकार है:
function afterFind($results, $primary){
// Only bother converting if the local timezone is set.
if(Configure::read('TIMEZONE'))
$this->replaceDateRecursive($results);
return $results;
}
function replaceDateRecursive(&$results){
$local_timezone = Configure::read('TIMEZONE');
foreach($results as $key => &$value){
if(is_array($value)){
$this->replaceDateRecursive($value);
}
else if(strtotime($value) !== false){
$from_timezone = 'Europe/Berlin';
if(/* using the Australia/Sydney database */)
$from_timezone = 'Australia/Sydney';
$value = $this->convertDate($value, $from_timezone, $local_timezone, 'Y-m-d H:i:s');
}
}
}
function convertDate($value, $from_timezone, $to_timezone, $format = 'Y-m-d H:i:s'){
date_default_timezone_set($from_timezone);
$value = date('Y-m-d H:i:s e', strtotime($value));
date_default_timezone_set($to_timezone);
$value = date($format, strtotime($value));
return $value;
}
तो करता है किसी को भी क्यों रूपांतरण एक से अधिक बार हो रहा है के बारे में कोई विचार है? या क्या तारीखों को बदलने के लिए किसी के पास बेहतर तरीका है? मैं स्पष्ट रूप से कुछ गलत कर रहा हूं, मैं बस इतना ही अटक गया हूं कि क्या है।
इस कोड के लिए धन्यवाद, मैं वास्तव में कुछ ऐसा ही कर रहा हूं। –