PHP

2010-02-04 6 views
8

में आईएसओ -8601 सप्ताह संख्या बनाम "आउटलुक" नंबरिंग मैं हाल ही में एक बड़ी समस्या में आया, क्योंकि मेरे पास एक ऐसी प्रणाली है जो ग्राहकों को साप्ताहिक भुगतान कर रही है।PHP

जैसा कि हम सभी जानते हैं, एक वर्ष में 52 सप्ताह हैं, और इसके लिए मानक हैं। मैं एक तारीख से सप्ताह संख्या प्राप्त करने के लिए PHP उर्फ ​​दिनांक ('डब्ल्यू') का उपयोग कर रहा हूं, जो मानक आईएसओ -8601 के अनुसार गणना करता है।

यहाँ कुछ संदर्भ हैं:

लेकिन यहाँ मुद्दा है: वर्ष 2009 के 53 सप्ताह है। ऐसा लगता है कि 400 वर्षों के भीतर ग्रेगोरियन कैलेंडर के माध्यम से 71 साल हैं जिनमें 53 सप्ताह हैं। यह एक चीज है जिसे मैं नहीं जानता था, और शायद कई भी नहीं थे।

विकिपीडिया के अनुसार:

2009-12-31 2009-W53-4 (आईएसओ साल 2009 53 सप्ताह, ग्रेगोरियन वर्ष 2009 का विस्तार है, जो शुरू होता है और गुरुवार के साथ समाप्त होता दोनों के साथ समाप्त होता है पर तीन दिन)।

और PHP में दिनांक फ़ंक्शन पूरी तरह से इसका सम्मान करता है।

यदि आप एमएस आउटलुक में देखते हैं, और कैलेंडर दृश्य में सप्ताह के दिन दिखाते हैं, तो यह 28 सप्ताह 200 9 से 03 जनवरी 2010 सप्ताह में 52 सप्ताह दिखाई देगा। क्या यह एक और मानक है? अमेरिकी मानक या कुछ?

यदि ऐसा है, तो PHP इसका समर्थन क्यों नहीं कर सकता है? क्या कोई ऐसा काम करता है जिसने इसका समर्थन किया?

क्या यह 53 सप्ताह के लिए सही है? हमारे पास यूरोपीय और अमेरिकी दोनों ग्राहक हैं।

+0

दिलचस्प सवाल। मैंने देखा है कि 2011 में आउटलुक का 53 सप्ताह है। ऐसा लगता है कि यह 1 सप्ताह के पहले सप्ताह होने के लिए "सप्ताह 1" को परिभाषित कर रहा है। सप्ताह के बाद रविवार या सोमवार को सेटिंग के आधार पर शुरू हो सकता है, यह वास्तव में अलग-अलग के लिए अलग हो सकता है उपयोगकर्ताओं। –

+0

मैंने अभी कोशिश की। आउटलुक आपको सप्ताह के शुरुआती दिन होने के लिए किसी भी दिन चुनने देगा, और सप्ताह की संख्या केवल उस सप्ताह के साथ शुरू होती है जिसमें 1 जनवरी शामिल है। इस प्रकार Outlook में सात अलग-अलग नंबरिंग योजनाएं उपलब्ध हैं। –

उत्तर

4

मुझे नहीं लगता कि आपको यहां कोई समस्या होगी। तथ्य यह है कि आप दिनांक और समय स्वरूपण और गिनती (ISO8601) के लिए एक अंतरराष्ट्रीय मानक का पालन कर रहे हैं। यदि आपके पास शिकायत करने वाले कोई भी ग्राहक हैं, तो बस उन्हें मानक पर देखें।

Outlook के सप्ताह नंबरिंग कुछ हद तक निम्नलिखित के बराबर है:

$dummyWeek = floor((date('z') + (date('N') - 1))/7) + 1; 

बिलिंग प्रयोजनों के लिए, आप एक मानक के रूप में ISO8601 का उपयोग कर बेहतर कर रहे हैं। असल में, यदि आप अपने करों को देखते हैं जिन्हें आप इस वर्ष भरने जा रहे हैं, तो वे पिछले वित्त वर्ष का 53 सप्ताह लंबा होने का वर्णन करेंगे।

गिनती के आउटलुक तरीके से समस्या यह है कि एक सप्ताह 7 दिनों की गारंटी नहीं है। उदाहरण के लिए, OW01-2010 केवल 2 दिनों से समझौता किया गया है: शुक्र जनवरी 1, शनि 2 जनवरी। यह एक सप्ताह के लिए एक बहुत ही कम बिलिंग अवधि है।

ISO8601 सप्ताह 7 दिनों तक होने की गारंटी है, इसलिए हमें प्रत्येक 4/5/6 वर्षों में एक लीप-सप्ताह की आवश्यकता है।

कौन उन विकल्पों में से एक आप पसंद करेंगे:

  • ISO8601: एक समय में 53 सप्ताह के एक बार के बाद, लेकिन उनमें से हर एक 7 दिन लंबा है।
  • Outlook: यादृच्छिक रूप से एक वर्ष में 52/53 सप्ताह होने के बाद, लेकिन "आधे सप्ताह" के लिए साल में दो बार भुगतान करना पड़ता है।
+0

दिनांक 'जेड' और 'एन'? – nathanchere

5

आउटलुक सप्ताह संख्या के लिए किसी भी प्रकार के मानक का पालन नहीं करता है। इसमें दो सेटिंग्स हैं जो सप्ताह संख्या निर्धारित करती हैं, जिन्हें "सप्ताह का पहला दिन" और "वर्ष का पहला सप्ताह" कहा जाता है।

सोमवार को "सप्ताह का पहला दिन" और "प्रथम सप्ताह का सप्ताह" "पहले 4-दिन सप्ताह" को स्थापित करके आईएसओ मानक अनुकरण किया जा सकता है।

प्रत्येक उपयोगकर्ता को आईएसओ मानक का पालन करने के लिए यह समायोजन करना होगा।

मुझे कोई अलग अमेरिकी मानक नहीं पता है, और जाहिर है, न तो Outlook करता है।

0

संयुक्त राज्य अमेरिका के बाहर दुनिया की तुलना में अधिक दुनिया है - और आईएसओ 8601 शायद संयुक्त राज्य अमेरिका के बाहर कहीं अधिक व्यापक रूप से उपयोग किया जाता है।

प्रारंभिक बयान 'एक वर्ष में 52 सप्ताह' केवल आंशिक रूप से सत्य है, जैसा कि आपने पाया है। आईएसओ सप्ताहों के संदर्भ में, आप सप्ताह के 53 के साथ समाप्त हो सकते हैं, जैसा विकिपीडिया में उल्लेख किया गया है। आपके पास वर्ष एन के सप्ताह 52 या वर्ष एन के सप्ताह 53 में तीन दिन का वर्ष एन + 1 हो सकता है। वर्ष एन के सप्ताह 1 में भी आपके पास तीन दिन का एन-1 हो सकता है। और आपको आईएसओ 'सप्ताह-वर्ष' के साथ-साथ 'सप्ताह' दोनों निर्धारित करने की आवश्यकता है - क्योंकि जब ग्रेगोरियन कैलेंडर वर्ष एन होता है, तो आईएसओ सप्ताह-वर्ष वर्ष एन -1 या एन + 1 हो सकता है (जिसके अंत में साल के साथ आप काम कर रहे हैं)। यही कारण है कि उदाहरण के लिए strftime() में अलग प्रारूप विनिर्देशक ('% वाई', '% y', '% g', '% g') हैं (लेकिन ध्यान दें कि POSIX मानक सोचता है कि जनवरी में पहले सोमवार से पहले दिन हैं चालू वर्ष के सप्ताह 0 में, पिछले वर्ष के 52 या 53 सप्ताह में नहीं)।

'सप्ताह' के लिए कोई विश्वसनीय 'यूएस मानक' प्रतीत नहीं होता है। आपके द्वारा उपयोग किए जाने वाले सॉफ़्टवेयर के आधार पर आपको अलग-अलग परिणाम मिलते हैं। यदि आप सप्ताह की परिभाषा Oracle देखते हैं, तो वर्ष के पहले सात दिन सप्ताह 1 होते हैं; वर्ष के अंत में आपके पास 53 या सप्ताह में 1 या 2 दिन हैं।

आईएसओ सप्ताह संख्या कोड के कार्यान्वयन के लिए SO 274861 भी देखें। भले ही आप भाषा में कोड न करें, एल्गोरिदम को आसानी से समझने योग्य होना चाहिए।

0

यदि आप PHP का उपयोग कर रहे हैं तो चेतावनी का एक शब्द आप MySQL का उपयोग भी कर सकते हैं। MySQLनहीं आईएसओ -8601 सप्ताह के सम्मेलनों का पालन करें, लेकिन क्या यह पर्याप्त है कि आप ऐसा सोच सकें। चूंकि अन्य लोग आउटलुक के बारे में बात कर रहे हैं, सप्ताह की संख्या की गणना करने के एक भयानक गैर-मानक तरीके की नकल करने की कोशिश करना इसके लायक नहीं है!

2

यहां जिस तरह से मैंने इसे हल किया है। नोट: मैं PHP में कोड, लेकिन एसक्यूएल में लागू एल्गोरिदम नीचे मेरे कोड का प्रासंगिक हिस्सा है। यह भी ध्यान रखें कि मैंने अलग-अलग '2028-12-31' को संभाला क्योंकि यह एक विशेष तारीख है जो 54 सप्ताह के सप्ताह के रूप में देती है।

// generate an sql that calculates the outlook week of $date (until 2033) 
function sqlWeek ($date) { 
    $week = "if(". $date . " = '2028-12-31', 54, (week(" . $date . ", 0) + if((year(" . $date . ") - 1) in (2011, 2016, 2022, 2033), 0, 1)) MOD (if (year(". $date .") = 2028, 54, if((year(".$date.") - 1) in (2011, 2016, 2022, 2033), 53, 52))))"; 

    return "concat(if(char_length(".$week.") < 2, concat('0', ".$week."), ".$week."), '/', year($date))"; 
} 
+0

इसके अलावा, कृपया ध्यान दें कि मैंने "सप्ताह ('2011-11-09', 0) का उपयोग किया" जिसका अर्थ है कि सप्ताह रविवार को शुरू होता है। यदि यह सोमवार को शुरू होता है, तो आपको "सप्ताह ('2011-11-09', 1)" का उपयोग करना चाहिए। – Amit

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