2016-09-28 11 views
5

मुझे जीएमटी -8 टाइमज़ोन (पीएसटी) के साथ प्राप्त एक तिथि को मानव पठनीय प्रारूप में परिवर्तित करने के लिए PHP DateTime का उपयोग करने में कठिनाई हो रही है टाइमज़ोन जीएमटी -7 (पीडीटी)।टाइमज़ोन पीएसटी को पीडीटी (जीएमटी -8 से जीएमटी -7) में परिवर्तित करने और कनवर्ट करने के लिए PHP डेटटाइम का उपयोग करना

$tz = new DateTimeZone('America/Los_Angeles'); 
$saleEndDate = new DateTime("2016-11-07T17:30:00-08:00"); 
$saleEndDate->setTimezone($tz); 
echo $saleEndDate->format('Y-m-d H:i:s'); 

ऊपर कोड के उत्पादन में है: 2016-11-07 17:30:00

यहाँ एक उदाहरण है। हालांकि, इसे 2016-11-07 18:30:00 प्रदर्शित करना चाहिए क्योंकि America/Los_Angeles अब डेलाइट बचत (जीएमटी -7, पीडीटी) में है।

से मैं क्या DateTime docs में पढ़ा है, new DateTime आदेश है कि स्ट्रिंग 2016-11-07T17:30:00-08:00 एक GMT -8 समय क्षेत्र है व्याख्या करने के लिए सक्षम होना चाहिए:

समय क्षेत्र पैरामीटर और वर्तमान समय क्षेत्र अनदेखी कर रहे हैं जब समय पैरामीटर में यूनिक्स टाइमस्टैम्प (जैसे 946684800) शामिल है या एक टाइमज़ोन निर्दिष्ट करता है (उदाहरण के लिए 2010-01-28T15: 00: 00 + 02: 00)।

फिर भी, मुझे नहीं लगता कि DateTime सही ढंग से जीएमटी -8 को पहचान रहा है।

क्या किसी को पता है कि टाइमज़ोन के बीच सही रूप से परिवर्तित करने के लिए क्या दृष्टिकोण आवश्यक है?

अद्यतन:

मैं भी DateTime निर्माता के लिए दूसरा पैरामीटर के रूप में एक DateTimeZone में गुजर की कोशिश की है, लेकिन यह भी कोई लाभ नहीं हुआ:

$tz = new DateTimeZone('America/Los_Angeles'); 
$saleEndDate = new DateTime("2016-11-07T17:30:00-08:00", new DateTimeZone("America/Los_Angeles")); 
$saleEndDate->setTimezone($tz); 
echo $saleEndDate->format('Y-m-d H:i:s'); 

भी काम नहीं करता:

$tz = new DateTimeZone('America/Los_Angeles'); 
$saleEndDate = new DateTime("2016-11-07T17:30:00", new DateTimeZone("PST")); 
$saleEndDate->setTimezone($tz); 
echo $saleEndDate->format('Y-m-d H:i:s'); 

यह भी काम नहीं करता है:

$tz = new DateTimeZone("PDT"); 
$saleEndDate = new DateTime("2016-11-07T17:30:00", new DateTimeZone("PST")); 
$saleEndDate->setTimezone($tz); 
echo $saleEndDate->format('Y-m-d H:i:s'); 
+0

मैंने डाउनवोट नहीं किया था, लेकिन शायद मुझे कुछ समझ में नहीं आ रहा है ... आपको लगता है कि इसे 18:30 में क्यों परिवर्तित करना चाहिए क्योंकि यह अभी डेलाइट सेविंग है? -8 मूल रूप से लॉस एंजिल्स है इसलिए शायद यहां परिवर्तित करने के लिए कुछ भी नहीं है। –

+1

http://stackoverflow.com/questions/17694894/different-timezone-types-on-datetime-object "संलग्न दिनांक 3 टाइमज़ोन के साथ डेटटाइम ऑब्जेक्ट्स डीएसटी को सही तरीके से अनुमति देगा।" आपका '$ saleEndDate' टाइप 1 के रूप में बनाया जा रहा है। – ceejayoz

+0

@PawelDubiel इसे परिवर्तित करना चाहिए, क्योंकि प्रदान किया गया समय' -8' है, लेकिन टाइमज़ोन सेट '-7' – zerkms

उत्तर

2
नहीं

सबसे बड़ी है, लेकिन यह एक ही रास्ता मैं के बारे में सोच सकते हैं क्या मैं यहाँ कर रहा हूँ DateTimeZone::getTransitions function उपयोग कर रहा है, तो आपके द्वारा दी गई तारीख डीएसटी है या नहीं यह निर्धारित करने के लिए इस

$tz = new DateTimeZone('America/Los_Angeles'); 
$saleEndDate = new DateTime("2016-11-07T17:30:00-08:00"); 
$saleEndDate->setTimezone($tz); 
$stamp = $saleEndDate->format('U'); 
$zone = $tz->getTransitions($stamp, $stamp); 
if(!$zone[0]['isdst']) $saleEndDate->modify('+1 hour'); 
echo $saleEndDate->format('Y-m-d H:i:s'); 

क्या करना है। यदि यह नहीं है, तो हम एक घंटे जोड़ते हैं। ध्यान दें कि इस समय ज़ोन परिवर्तन नहीं करता है, यह सिर्फ डीएसटी के लिए शिफ्ट

You can see it in action here

1

DateTime कार्य कर रहा है एकदम सही ढंग से ठीक कर दे। जब तक कि आप उस क्षेत्र में न हों जो अधिकतर क्षेत्र में विभिन्न डीएसटी देखे, America/Los_Angeles 6 नवंबर (2016 में) पर डीएसटी (पीडीटी-> पीएसटी) छोड़ दिया।

https://www.timeanddate.com/news/time/usa-canada-end-dst-2016.html

timezeonedb आप निरीक्षण कर सकते हैं दिनांकों यह अपने विशेष दिनांक/समय (जो Machavity किया) के लिए सरणी खोज के द्वारा उपयोग करता से

और तथ्य यह है कि यह डीएसटी में नहीं है और उसके बाद के लिए चला गया मिल गया इसे मैन्युअल रूप से संशोधित करें। जो उत्तर नहीं है क्योंकि यह अंततः विफल हो जाएगा जब तक आप मैन्युअल सुधार को रोकने के लिए मैन्युअल रूप से कट-ऑफ समय नहीं जोड़ते।

अपनी तिथि के आसपास संक्रमण दिनांकों निरीक्षण से पता चलता है:

date_default_timezone_set('America/Los_Angeles'); 
$theDate = new DateTime("2016-11-07T17:30:00",new DateTimeZone("America/Los_Angeles")); 
$theDateBefore = new DateTime("2016-03-01"); 
$theDateAfter = new DateTime("2017-03-15"); 
echo "<pre>"; 
print_r($theDate->getTimezone()->getTransitions(
    $theDateBefore->getTimestamp(),$theDateAfter->getTimestamp())); 
echo "</pre>"; 

4 की एक सरणी में जिसके परिणामस्वरूप:

Array 
(
    [0] => Array 
     (
      [ts] => 1456819200 
      [time] => 2016-03-01T08:00:00+0000 
      [offset] => -28800 
      [isdst] => 
      [abbr] => PST 
     ) 

    [1] => Array 
     (
      [ts] => 1457863200 
      [time] => 2016-03-13T10:00:00+0000 
      [offset] => -25200 
      [isdst] => 1 
      [abbr] => PDT 
     ) 

    [2] => Array 
     (
      [ts] => 1478422800 
      [time] => 2016-11-06T09:00:00+0000 
      [offset] => -28800 
      [isdst] => 
      [abbr] => PST 
     ) 

    [3] => Array 
     (
      [ts] => 1489312800 
      [time] => 2017-03-12T10:00:00+0000 
      [offset] => -25200 
      [isdst] => 1 
      [abbr] => PDT 
     ) 

) 

सरणी [0] theDateBefore में के रूप में प्रभाव में समय क्षेत्र है और आप देख सकते हैं तिथियों के परिवर्तन आपके टाइमज़ोन के लिए प्रभावी हैं।

आपकी बिक्री तिथि पीडीटी से पीएसटी में परिवर्तन के बाद गिरती है।

कोड को एक समायोजित दिनांक/समय वापस करने के लिए आपको मैन्युअल रूप से इसे बदलने की आवश्यकता होगी। इसे स्वीकार करने के तरीके को गलत परिणाम मिलेगा। जैसा कि मैंने उल्लेख किया है, आपको उन तिथियों के साथ घूमने की आवश्यकता होगी, जिन्हें आप कस्टम टाइम ज़ोन लागू करना चाहते हैं।

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