2011-04-05 11 views
12

लांग कमपीएचपी date_default_timezone_set() पूर्वी मानक समय (ईएसटी)

वहाँ एक अधिकारी है, कहानी अन-पदावनत समय क्षेत्र है कि PHP5 पूर्वी मानक समय के लिए पहचानता है - नहीं पूर्वी डेलाइट समय?

लघु कहानी लंबे :-P

वाह, मैं विश्वास नहीं कर सकता है कि PHP समय सेट से बाहर इस तरह के एक क्लस्टर floogen बनाता है।

मैं अपनी स्क्रिप्ट के लिए टाइमज़ोन सेट करने के लिए PHP5 की date_default_timezone_set() का उपयोग करना चाहता हूं। मैं मानक समय का उपयोग करना चाहता हूं। मैं मेरी स्क्रिप्ट डेलाइट बचत समय का निरीक्षण करना चाहता हूं। मैं gmtime() का उपयोग नहीं करना चाहता हूं और हर बार जब मेरा प्रोग्राम एक समय लिखता है तो 60 * 60 * 5 सेकेंड घटाएं। मैं उस मान को एक वैरिएबल में सहेजना नहीं चाहता हूं। डिफ़ॉल्ट टाइमज़ोन सेट करना अधिक सुरुचिपूर्ण है और स्क्रिप्ट को अन्य सर्वरों और लोकेशंस के लिए अधिक पोर्टेबल बनाता है।

दुर्भाग्यवश PHP को डिफ़ॉल्ट समय क्षेत्र सेट करते समय अपने बेवकूफ "आधिकारिक टाइमज़ोन" का उपयोग करने की आवश्यकता होती है। एक "अमेरिका/न्यू_यॉर्क" है लेकिन मुझे नहीं पता कि यह या आधिकारिक PHP टाइमज़ोन डेलाइट बचत समय का पालन करता है या नहीं। प्रयोग के माध्यम से, मैंने पाया कि "अमेरिका/न्यू_यॉर्क" डीएसटी का निरीक्षण करता है। "अमेरिका/पनामा" ईएसटी है और इस प्रकार डीएसटी का पालन नहीं करता है ... लेकिन क्या होगा यदि पनामा को भविष्य में डीएसटी के बारे में कभी भी अपना मन बदलना चाहिए? (उन्होंने 1 9 08 में डीएसटी देखा)

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

तो फिर वहाँ इस

http://us.php.net/manual/en/timezones.others.php

ऊपर के लिंक सूची मैं अनुचित हैं समय क्षेत्र क्या यह सोचते रहा है ...। "ईएसटी" वहां है लेकिन बहुत ही यूएसए केंद्रित है इसलिए मैं समझता हूं कि इसे क्यों हटा दिया गया है। "ईसीटी/जीएमटी -5" भी वहां है और मुझे बिल्कुल नहीं पता कि यह क्यों बहिष्कृत है। यदि आप मुझसे पूछते हैं, तो सभी जगहों का नाम टाइमज़ोन को बहिष्कृत किया जाना चाहिए और जीएमटी टाइमज़ोन को बहिष्कृत किया जाना चाहिए ... लेकिन इसे प्राप्त करें ... "ईसीटी/जीएमटी -5" वास्तव में गलत है! मुझे संयुक्त राज्य अमेरिका के पूर्वी मानक समय प्राप्त करने के लिए "ईसीटी/जीएमटी +5" का उपयोग करना पड़ा। मुझे पूरा यकीन है कि मैं पूर्वी तट पर इंग्लैंड से 5 घंटे पहले नहीं हूं।

उत्तर दिया?

कोई भी वास्तव में प्रश्न का उत्तर नहीं दिया। तो मुझे लगता है कि मैं इसे खुद जवाब दूंगा। "नहीं, कोई मानक, गैर-बहिष्कृत टाइमज़ोन नहीं है कि PHP5 पूर्वी मानक समय के लिए पहचानता है"

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

मैं अनिच्छुक रूप से उस दोस्त को क्रेडिट दूंगा जो आपको दिखाता है कि समय को सही तरीके से कैसे स्टोर और पुनर्प्राप्त करना है ताकि भविष्य के लोगों को यह पता चल सके कि यह सही तरीके से कैसे किया जाए।

+0

कभी-कभी आपको केवल उस चीज़ का उपयोग करना और उपयोग करना होता है जिसे आप "अनुमानित" नहीं करते हैं। मैं 'यूएस/पूर्वी' का सुझाव दूंगा, हालांकि मुझे नहीं पता कि इसमें डीएसटी शामिल है या नहीं। यूटीसी/एटीसी निश्चित रूप से –

+0

ईएसटी को मजबूर करने का उद्देश्य क्या नहीं है? शायद समस्या को हल करने के लिए एक बेहतर तरीका है। – Matthew

+0

ईएसटी का उपयोग करना है। मेरे पास बाकी स्क्रिप्ट तक पहुंच नहीं है। मैं php5 में किसी की पुरानी php4 गलती विरासत में एक ठेकेदार हूं। – mrbinky3000

उत्तर

19

जो चीज आप करना चाहते हैं वह व्यावहारिक नहीं है और इससे आपके उपयोगकर्ताओं से नफरत होगी।

नामित समय क्षेत्र के पीछे का पूरा कारण स्थानीय समय का सटीक रूप से प्रतिनिधित्व करना है। स्थानीय समय के रूप में "मानक" समय का प्रतिनिधित्व करते समय जब स्थानीय क्षेत्र डीएसटी के अंदर होता है तो वह गलत रूप से गलत होता है। उस समय क्षेत्र के अंदर कोई भी जो समय को पढ़ता है उसे गलत जानकारी दी जा रही है।

यदि आपको समय क्षेत्र और समय के साथ काम करने और काम करने की आवश्यकता है, तो उस उद्देश्य के लिए यूटीसी का उपयोग करें, यानी भंडारण और सामान्य गणित। यह याद रखना उचित है कि यहां तक ​​कि पुराना यूनिक्स टाइमस्टैम्प भी "मध्यरात्रि से पहले सेकंड, 1 जनवरी, 1 9 70, यूटीसी" है।

यदि आपको उपयोगकर्ता के लिए स्थानीय समय का प्रतिनिधित्व करने की आवश्यकता है, तो आपको उन्हें अपना स्थानीय समय क्षेत्र चुनने की अनुमति देनी चाहिए, और इसे को पर प्रदर्शित करना चाहिए। आधुनिक PHP की डेटटाइम और डेटटाइमज़ोन इस मृत-सरल बनाते हैं। इंटरैक्टिव प्रॉम्प्ट से:

php > $utc = new DateTimeZone('UTC'); 
php > $amla = new DateTimeZone('America/Los_Angeles'); 
php > 
php > $two_past_midnight = new DateTime('2011-04-05 00:02', $utc); 
php > $two_past_midnight->setTimeZone($amla); 
php > echo $two_past_midnight->format('Y-m-d H:i:s'); 
2011-04-04 17:02:00 

कोई गड़बड़ नहीं, कोई झगड़ा नहीं। जब हमने समय क्षेत्र स्विच किया तो उसने हमारे लिए गणित का ख्याल रखा।


विकल्प में, आप सच में, सच, वास्तव में डीएसटी समय क्षेत्र बाहर समतल करना चाहते हैं, getTransitions और getOffset पर संयोजन में the various timezone date() formats, I विशेष रूप से के साथ देखो। जब आप किसी भी डीएसटी जोन के "मानक" संस्करण को अगले संक्रमणों के अनुसार और उसके अनुसार समायोजित करते हैं तो परिणामस्वरूप जानकारी पर आप पोक और प्रोडक्ट कर सकते हैं। याद रखें कि अलग-अलग क्षेत्रों में विभिन्न क्षेत्रों में संक्रमण होता है, और सभी क्षेत्रों में एक ही राशि से संक्रमण नहीं होता है ... और कुछ भी संक्रमण नहीं करते हैं। I think someone mentioned Indiana पहले से ही।

आम तौर पर मैं यहां नमूना कोड भी प्रदान करता हूं, लेकिन तारीख गणित मुझे हिंसा के लिए एक अत्याचारी प्यास से भरता है। किसी ने भी फैसला किया कि 60, 60, 24, 7, 4-6, 12 और 52 समय के बारे में सोचने के स्वीकार्य तरीके थे और तारीखें बुरे, बुरे लोग थे। शुक्र है कि वे सैकड़ों और हजारों सालों से मर चुके हैं।

+0

+1 कोड में दिखाने में सक्षम होने के लिए जो मैं अंग्रेजी में व्याख्या करने की कोशिश कर रहा था –

+0

मैं आपके साथ 100% सहमत हूं। मैं हमेशा यूटीसी में समय संग्रह करता हूं और स्थानीय समय में कनवर्ट करें। हालांकि, मैं एक स्क्रिप्ट के हिस्से पर काम कर रहा हूं एक ग्राहक के लिए और बाकी साइट तक पहुंच नहीं है। वे अपने सभी समय स्टोर करने के लिए ईएसटी (जो डीएसटी नहीं देखता) का उपयोग करने पर बस गए। इसलिए मुझे आश्चर्य हुआ जब मुझे पता चला कि डिफ़ॉल्ट समय क्षेत्र को डिफ़ॉल्ट समय क्षेत्र में सेट करना इतना मुश्किल था। ऐसा लगता है कि यह PHP मानचित्र से मिटा दिया गया था। मुझे लगता है कि अमेरिका में कहीं भी जीएमटी -5 (ईएसटी) समय नहीं देखता है। हालांकि, बहुत बहुत धन्यवाद। – mrbinky3000

+0

वे "मानक" से "डेलाइट" के स्वचालित रूपांतरण को कैसे बाईपास कर रहे हैं? विभिन्न प्रौद्योगिकी ढेर? प्रागैतिहासिक PHP? यदि आप चूसने के साथ फंस गए हैं, तो आधुनिक डेटटाइम सिस्टम का उपयोग करने के बजाय सादे पुराने यूनिक्स टाइमस्टैम्प पर वापस गिरने पर विचार करें। यदि आप PHP को यह विश्वास दिला सकते हैं कि यह यूटीसी में चल रहा है तो आप इसे बिना 5 घंटे के घटाए मैन्युअल रूप से कर सकते हैं। – Charles

1

America/New_York डीएसटी का निरीक्षण करता है और अनुशंसित टाइमज़ोन है। (मैं पिछले साल एक सम्मेलन में गया था जहां Derick Rethans, जिसने बहुत सारी तारीख/समय कोड लिखा था, बोलते थे।) क्षेत्रीय समय क्षेत्र के पीछे विचार यह है कि वे शहर/क्षेत्र के लिए समय क्षेत्र नियमों का पालन करते हैं (यही कारण है कि वहां 7 इंडियाना टाइमज़ोन की तरह हैं)।

+0

मैं * डीएसटी नहीं था *। मुझे मानक समय चाहिए।:-( – mrbinky3000

+0

क्षमा करें, मैंने आपके प्रश्न के उस हिस्से को गलत तरीके से पढ़ा है। यदि आप एक बहिष्कृत टाइमज़ोन का उपयोग करने के खिलाफ हैं, तो मैं यूटीसी का उपयोग करने और मैन्युअल रूप से ऑफसेट जोड़ना चाहता हूं। क्या कोई कारण है कि आप डीएसटी से बचना चाहते हैं कि मैं हूं गायब? –

0

आपको हमेशा यूटीसी का उपयोग करके समय स्टोर करना चाहिए, जो time() रिटर्न है, फिर सर्वर के स्थान के आधार पर टाइमज़ोन सेट करें, जो लागू होने पर डीएसटी के लिए अपडेट किया जाएगा।

+1

'समय()' वास्तव में यूटीसी का उपयोग नहीं करता है। यह निश्चित समय के बाद सेकंड की गिनती है (जो यूटीसी पर आधारित होता है)। लेकिन मैं सहमत हूं कि 'gmdate() ' या 'समय() 'आम तौर पर सबसे अच्छा तरीका है। – Matthew

+0

मैं सहमत हूं। टाइम्स को केवल यूटीसी के रूप में संग्रहीत किया जाना चाहिए। लेकिन मैं सिर्फ एक वी कार्यकर्ता मधुमक्खी किसी और की लिपि को अपडेट कर रहा हूं और बाकी के पास अपडेट करने का अधिकार नहीं है साइट। इसलिए ईएसटी के रूप में समय लिखने की मेरी इच्छा और ईडीटी नहीं। धन्यवाद हालांकि – mrbinky3000

0

ठीक है, यदि आप वास्तव में एक्स घंटे पहले या एक यूटीसी तिथि के बाद चाहते हैं, मैं यह कर जाएगा:

$now = gmdate('Y-m-d H:i:s', time() - 3600 * $hours); 

आपके मामले में, $hours 5 हो सकता है, मुझे लगता है।

जैसा कि अन्य ने सुझाव दिया है, स्वयं शामिल है, यह अच्छा अभ्यास नहीं है ... लेकिन आप इसके बारे में जानते हैं।

+0

शायद यही वह है जो आपने कहा था कि आपने नहीं किया करना चाहता हूँ। आपने 'gmtime' का उपयोग किया था, जिसका शायद आप' gmdate' मतलब था। भले ही, यह दृष्टिकोण मैं उपयोग करूंगा यदि आप यह सुनिश्चित करना चाहते हैं कि स्क्रिप्ट इस तरह से काम करे। एक मानक में 'standard_date()' जैसे फ़ंक्शन में लपेटें जो कॉन्फ़िगरेशन से '$ घंटे' पढ़ता है। – Matthew

1
echo ' Format ' . date('m/d/Y H:i:s a') ; 
<br/>//maketime function- mktime(hour,minute,second,month,day,year,is_dst) 
<br/>$EasternTimeStamp =mktime(date('H')-6,date('i'),date('s'),date("m"),date("d"),date("Y")); 
<br/>// date function- date(format, timestamp) 
<br/>echo 'Format ' . date('m/d/Y H:i:s a',$EasternTimeStamp) ; 
संबंधित मुद्दे