2016-07-07 3 views
5

मुझे लगता है कि मैं आईएसओ 8601 के बारे में पूरी तरह से अवगत हूं और एक वर्ष का पहला सप्ताह उस सप्ताह में है जिसमें सोमवार है। हालांकि मैं PHP (5.6) डेटटाइम कक्षा में एक अजीब व्यवहार में आया था।PHP के डेटटाइम में गुम सप्ताह-> संशोधित करें ('अगले सप्ताह')

यहाँ मेरी कोड है:

$start = new DateTime('2009-01-01 00:00'); 
$end = new DateTime(); 
$point = $start; 

while($point <= $end){ 
    echo $point->format('YW'); 
    $point = $point->modify('next week'); 
} 

यह सही ढंग से

200901 
200902 
200903 
... 

डालता है लेकिन अगर मैं एक प्रारंभ दिनांक पहले तो $start = new DateTime('2008-01-01 00:00'); की तरह कुछ 2008 में के रूप में लेने मैं एक अलग परिणाम प्राप्त:

... 
200852 
200801 // <=== 2008?? 
200902 
200903 
... 

क्या यह एक PHP बग है या क्या मुझे यहां कुछ याद आ रही है?

+0

क्योंकि यह 200 9 का पहला सप्ताह है, 'echo $ point-> format (' YW ')' -> "को आजमाएं। $ प्वाइंट-> प्रारूप ('वाई-एम-डी'); 'आशा है कि आप –

उत्तर

4

इस के साथ tinkered और अंत में यह समझ से बाहर

$start = new DateTime('2008-12-29 00:00'); 
$end = new DateTime('2009-01-7 00:00'); 
$point = $start; 

while($point <= $end){ 
    echo $point->format('YW') . "\t"; 
    echo $point->format('m-d-Y') . "\n"; 
    $point = $point->modify('next week'); 
} 

तो यहाँ पहली तारीख 2008-12-29 है। इस प्रकार Y सही है। लेकिन 2008-12-29 भी सप्ताह 1 है। तो W भी सही

https://3v4l.org/JZtqa

+0

चीज़ को समझेंगे तो यह एक PHP बग है। यदि आप हफ्तों तक एक वर्ष के माध्यम से फिर से शुरू करते हैं तो आप उम्मीद करेंगे कि यह 53 वें सप्ताह की सही गणना करे, है ना? –

+2

@StevenM यह एक बग नहीं है। वास्तव में यह कैसे ISO8601 इसे देखता है। [इस विकिपीडिया आलेख को देखें] (https://en.wikipedia.org/wiki/ISO_week_date) और आप ध्यान दें कि 'सोम 2 9 दिसंबर 2008' '200 9-W01-1' – Machavity

+0

हां, बिल्कुल - लेकिन PHP बनाता है कि 2008 * 200 9 में पहला सप्ताह .... –

0

है यह एक बग नहीं है! कोई फर्क नहीं पड़ता आरंभ तिथि है जब

... 
200852 
200901 
200902 
... 

:

echo $point->format('oW'); 

बजाय

echo $point->format('YW') 

पैदा करता है: @Machavity से प्रेरित होकर और इस this similar question के आधार पर मैं एक समाधान मिल गया। यह वास्तव में एक आरटीएम मामला है, पीएचपी मैनुअल राज्यों के रूप में:

==> आईएसओ 8601 साल नंबर। यह वाई के समान मूल्य है, सिवाय इसके कि यदि आईएसओ सप्ताह संख्या (डब्ल्यू) पिछले या अगले वर्ष से संबंधित है, तो उस वर्ष इसके बजाए उपयोग किया जाता है। (PHP 5.1.0 में जोड़ा गया)

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