2012-04-12 8 views
6

हाय मुझे लगता है कि डेटाटाइम विधि अपेक्षित काम करने में परेशानी हो रही है? मैं कुछ गलत कर रहा हूँ?php डेटटाइम createFromFormat कार्यक्षमता

// Passes OK 
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012'); 
var_dump($dateTime); 

// should fail but returns - 2016-09-25 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
var_dump($dateTime); 

// correctly returns False 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail'); 
var_dump($dateTime); 

// should fail but returns 2019-08-29 09:58:10 
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012'); 
var_dump($dateTime); 

enter image description here

उत्तर

30

चीज़ के बारे में DateTime::createFromFormat अप्रत्याशित इनपुट में पहचानता की दो प्रकार के होते हैं वह यह है कि पीछे किया जाता है।

इनपुट '56/56/fail' जैसे त्रुटि उत्पन्न करता है, इसलिए false वापस आ गया है और सबकुछ अच्छा है। हालांकि, '56/56/2012' कोई त्रुटि नहीं बल्कि एक चेतावनी देता है, और वास्तव में 2012 के 56 वें महीने के 56 वें दिन के रूप में इसका विश्लेषण किया जाता है। 2012 के बाद से 56 महीने नहीं हैं, इसलिए PHP आंतरिक रूप से इसे 2016 + 8 महीने = अगस्त 2016 में बदल देता है। और उसके बाद से महीने में 56 दिन नहीं हैं, हमारे पास सितंबर 2016 (56 - 31) दिन = 25 सितंबर 2016 को एक और मुआवजा है। इसलिए अप्रत्याशित होने पर, यह वास्तव में सही है।

आप इस स्वत: समायोजन की अनुमति नहीं देने के लिए चाहते हैं, तो आप DateTime कारखाने विधि लपेट और संदर्भ के रूप में DateTime::getLastErrors उपयोग करने के लिए:

$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
$errors = DateTime::getLastErrors(); 
if (!empty($errors['warning_count'])) { 
    echo "Strictly speaking, that date was invalid!\n"; 
} 

See it in action

+0

उत्तर के लिए धन्यवाद। 100% स्थान था और बहुत अच्छी तरह से समझाया गया। –

+0

जांच के लिए प्रति के लिए तैयार होने के लिए/पेस्ट यह प्रारंभिक जांच के साथ-साथ होना चाहिए: अगर (! $ DateTime || खाली ($ त्रुटियों [ 'warning_count'])) { :) –

1

वास्तव में यह सही है: उदाहरण के लिए यदि आप 2012/04/31 के साथ डेट बनाने (अमान्य तिथि) पीएचपी रिटर्न 2012/05/01 (मई का पहला दिन)! तरह कि त्रुटियाँ पैदा करता है, और तरह कि चेतावनी उत्पन्न करता है:

यह दृश्यों

1

PHP एक अजीब जानवर है (कम से कम कहने के लिए)। 56/56/2012 परिणाम तक सभी अतिरिक्त महीनों और दिनों में जोड़े जाने के परिणामस्वरूप जब तक यह सही न हो जाए (भगवान केवल इसके पीछे तर्क जानता है)।

+1

मुझे लगता है तर्क यह है कि यह प्रोग्रामर को कुछ आलसी तारीख कैल्क्स करने देता है। यदि आप किसी चीज़ के लिए 90 दिन या 18 महीने जोड़ना चाहते हैं, तो आप कैल्क्स किए बिना संख्याओं को जाम कर सकते हैं, महीनों/वर्षों को स्वयं लपेट सकते हैं, और PHP आपके लिए इसे सॉर्ट कर देगा और आप जो चाहते हैं उसे वापस कर देंगे। –

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