2012-01-10 21 views
12

मैं तिथियों के लिए सप्ताह संख्याओं की गणना करने के बीच में हूं, लेकिन System.Globalization.Calendar 31 दिसंबर 2007 और 2012 के लिए (अन्य वर्षों के बीच) अजीब परिणाम लौटा रहा है।System.Globalization.Calendar.GetWeekOfYear() अजीब परिणाम देता है

Calendar calendar = CultureInfo.InvariantCulture.Calendar; 
var date = new DateTime(2007, 12, 29); 
for (int i = 0; i < 5; i++) 
{ 
    int w = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    Console.WriteLine("{0}\t{1}", date.ToString("dd.MM.yyyy"), w); 
    date = date.AddDays(1); 
} 

परिणाम

29.12.2007  52 
30.12.2007  52 
31.12.2007  53 <-- 
01.01.2008  1 
02.01.2008  1 

29.12.2012  52 
30.12.2012  52 
31.12.2012  53 <-- 
01.01.2013  1 
02.01.2013  1 

जहां तक ​​मैं समझता हूँ, वहाँ वर्ष 2007 और 2012 में एक सप्ताह में 53 नहीं होना चाहिए, लेकिन कुछ दिनों सप्ताह 1 में शामिल किया जाना चाहिए वहाँ एक रास्ता है इस व्यवहार कोमें बदलने के लिए?

+2

"दिनों को सप्ताह 1 में शामिल किया जाना चाहिए": किस नियम के अनुसार? नियमों के मुताबिक, मुझे पता है कि वर्ष के आखिरी दिन अगले वर्ष के पहले सप्ताह का हिस्सा कभी नहीं हैं ... –

+3

आईएसओ 8601 के अनुसार। Http://en.wikipedia.org/wiki/ISO_8601 – sshow

+0

बीटीडब्ल्यू, क्यों क्या आप उस अजीब तारीख प्रारूप का उपयोग कर रहे हैं? मुझे लगता है कि मैंने कभी भी '2007.12.2 9' के रूप में लिखी तारीखें नहीं देखी हैं। – svick

उत्तर

12

documentation for the CalendarWeekRule enumeration विशेष रूप से कहा गया है कि यह "आईएसओ 8601 के लिए सीधे नक्शा नहीं है" , और ISO 8601 Week of Year format in Microsoft .Net के लिंक, एक ब्लॉग एंट्री जो मतभेदों का वर्णन करती है।

+0

यह सबकुछ बताता है। धन्यवाद – sshow

+7

मैं वर्कअराउंड को भी देखना नहीं चाहता हूं। मेरा सरल सवाल है: क्यों? इससे कौन लाभान्वित है? क्यों * थोड़ा * परिवर्तन इतना है कि आपको अंतर देखने के लिए दस में से दो तिथियां चुननी होंगी? थोड़ा निराशाजनक ... – Piddu

0

सप्ताह पहचानकर्ताओं के अद्वितीय होने के लिए 52 सप्ताह होने की आवश्यकता नहीं है, तो आपके पास किसी विशेष सप्ताह में 7 दिनों की आवश्यकता नहीं है।

यदि यह आपके लिए कोई समस्या है तो किनारे के मामले को संभालने के लिए कोड जोड़ें।

1

CalendarWeekRule के मानों पर नज़र डालें। आप FirstFourDayWeek का उपयोग कर रहे हैं, और इसलिए आप अपने द्वारा वर्णित मान प्राप्त कर रहे हैं। यदि आप हर सप्ताह लगभग 7 दिन चाहते हैं, तो आपको FirstFullWeek का उपयोग करना चाहिए।

आपके मामले में, इसका मतलब यह होता है कि 31. 12. 2007 सप्ताह 53 हो जाएगा, लेकिन इतना इच्छा 2. 1. 2008.

+1

के लिए संपादित किया गया है यह समाधान आईएसओ 8601 का पालन नहीं करता है, क्योंकि पहले सप्ताह में बहुमत (चार या अधिक) दिनों के साथ शुरुआती सप्ताह वर्ष [सप्ताह 1 है] * – sshow

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