2012-01-04 19 views
7

मैं किसी भी वर्ष में सप्ताहों की संख्या प्राप्त करना चाहता हूं। हालांकि 52 को सामान्यीकृत विश्वव्यापी उत्तर के रूप में स्वीकार किया जाता है, 2015, 2020 और 2026 के लिए कैलेंडर वास्तव में 53 सप्ताह हैं।किसी दिए गए वर्ष में सप्ताहों की संख्या की गणना

क्या कोई तरीका है कि मैं इसकी गणना कर सकता हूं, या कोई भी कार्य जो मेरी मदद करेगा?

+0

सभी के लिए सामान्य टिप्पणी जो वास्तव में सवाल इसके बाद के संस्करण का उत्तर न मिले लेकिन पता करने के लिए उपयोगी है: को समझने के लिए क्यों कैलेंडर वर्ग "एक वर्ष में सप्ताह की संख्या" के लिए रिटर्न 53 आप को समझना होगा कि कैसे 'getFirstDayOfWeek() 'और' getMinimalDaysInFirstWeek() 'विधियों की गणना गणना में उपयोग की जाती है। यदि "सप्ताह का पहला दिन" उदाहरण के लिए सोमवार के रूप में निर्दिष्ट किया गया है और "पहले सप्ताह में न्यूनतम दिन" 4 है और वर्ष का पहला सोमवार 5 जनवरी को है, तो 5 जनवरी से पहले का सप्ताह उस हिस्से के रूप में वर्गीकृत किया गया है साल। –

उत्तर

11

ISO week date format पर विकिपीडिया लेख के अनुसार उपरोक्त जानकारी का उपयोग कर सकते हैं, आप इसे निम्नलिखित कोड का उपयोग कर की गणना कर सकते हैं।

Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 2015); 
    cal.set(Calendar.MONTH, Calendar.DECEMBER); 
    cal.set(Calendar.DAY_OF_MONTH, 31); 

    int ordinalDay = cal.get(Calendar.DAY_OF_YEAR); 
    int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0 
    int numberOfWeeks = (ordinalDay - weekDay + 10)/7; 
    System.out.println(numberOfWeeks); 
+1

थेंक्स मंजुला। किसी भी तरह मेरी समस्या स्वचालित रूप से तय की गई थी। मुझे लगता है कि कैलेंडर वर्ग सप्ताह 53 पर विचार नहीं करता है। (कोई विचार नहीं, यह किस दिनांक प्रारूप का पालन करता है ...)। लेकिन calendar.set (कैलेंडर.WEEK_OF_YEAR, 52); कैलेंडर.सेट (कैलेंडर.YEAR, 2015); SimpleDateFormat formatter = new SimpleDateFormat ("ddMMM yyyy"); दिनांक प्रारंभ दिनांक = calendar.getTime(); calendar.add (कैलेंडर.डेट, 6); दिनांक endDate = calendar.getTime(); मुझे सप्ताह के लिए 27 दिसंबर 2014 और 2 जनवरी 2014 को सप्ताह की शुरुआत और समाप्ति तिथि देता है। :) :) (ये तिथियां मैं 53 सप्ताह की उम्मीद कर रहा था, जो इस प्रश्न धागे का कारण था .. :)) – AndroidGuy

+0

यह वास्तव में एक बग पेश करता है। मैंने अभी कोशिश की: 2016 के लिए, यह 52 लौटा, लेकिन कैलेंडर मानते हैं कि इसमें 53 सप्ताह हैं। यह वास्तव में 53 सप्ताह है क्योंकि यह गुरुवार से शुरू होता है। मैं आपके फ़ंक्शन की समीक्षा करता हूं: मैं इसे नीचे पोस्ट करूंगा। इस बग को हटाने के लिए कृपया अपना उत्तर संपादित करें :) –

4
Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 2015); 
    cal.set(Calendar.MONTH, Calendar.DECEMBER); 
    cal.set(Calendar.DAY_OF_MONTH, 31); 
    System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); 
+1

यह हर साल काम नहीं करता है। यहां तक ​​कि आपका उदाहरण 53 के बजाय "1" लौटाता है। –

+1

लेकिन यह एक सप्ताह 01 है। आईएसओ -8601 में सप्ताह संख्या परिभाषित की गई है। सप्ताह 1 में वर्ष के पहले गुरुवार के साथ एक है। –

10

आप से ISO week date.

निम्नलिखित जानकारी के साथ अपने आप को कोड कर सकते हैं औसत पर, एक साल हर 5.6 साल 53 सप्ताह है।

400 साल के चक्र (वर्तमान वर्षों के लिए 2000 जोड़ें) में निम्नलिखित 71 वर्षों में 53 सप्ताह हैं। सूचीबद्ध सूचीबद्ध वर्षों में 52 सप्ताह नहीं हैं।

004, 00 9, 015, 020, 026, 032, 060, 045, 048, 076, 082, 088, 0 9, 0 9, 105, 111, 116, 122, 128, 133, 13 9, 144, 150, 156, 161, 167, 172, 178, 184, 18 9, 1 9, 201, 207, 212, 218, 224, 22 9, 235, 240, 246, 252, 257, 263, 268, 274, 280, 285, 2 9 1, 2 9 6, 303, 308, 314, 320, 325, 331, 336, 342, 348, 353, 35 9, 364, 370, 376, 381, 387, 3 9 2, 3 9 8.

आप वापस जाने के लिए 52 या 53 तदनुसार :)

3

मैं अपने ले जावा 8 में तैयार निम्नलिखित के साथ चलाने के लिए कोड नई तिथि एपीआई के उपयोग पर देने के लिए करना चाहते हैं:

private static long getNumberOfWeeksInYear(LocalDate date) { 
    LocalDate middleOfYear = date.withDayOfMonth(1).withMonth(6); 
    return middleOfYear.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum(); 
} 

public static void main(String[] args) { 
    for (int year = 2000; year < 2400; year++) { 
     long numberOfWeeks = getNumberOfWeeksInYear(LocalDate.of(year, 1, 1)); 
     if (numberOfWeeks != 52) { 
      System.out.println(year + " has " + numberOfWeeks + " weeks"); 
     } 
    } 
} 

उत्पादन होता है:

2004 53 सप्ताह
200 9 में 53 सप्ताह
2015 53 सप्ताह
2020 में 53 सप्ताह
2026 है 53 सप्ताह
2032 में 53 सप्ताहहै 03,210 ...

और इसी तरह ...

date.withDayOfMonth(1).withMonth(6); चाल क्योंकि इस छोड़ते हुए थोड़ा अलग उत्पादन में परिणाम है, तो LocalDate.of(year, 1, 1) पारित हो जाता है:

2004 है 53 सप्ताह
2005 है 53 सप्ताह
...

मैं अभी भी जावा 8 डेट एपीआई में नया हूं, लेकिन मुझे पूरा यकीन है कि यह व्यवहार bec यूज़ 2005-01-01 2014 के 53 सप्ताह का हिस्सा है। इससे date.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum() 2014 के सप्ताह के आधार पर सप्ताहों की संख्या लौटाता है।

1

Link to answer

gregorianCalendar.set(year, 12, 31); 
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR); 
5

त्वरित दो लाइनर:

Calendar calendar = Calendar.getInstance(); 
Integer weeksOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); 
+1

इस विधि के बारे में अधिक विस्तृत स्पष्टीकरण देखना अच्छा लगेगा। 'getActualMaximum' वर्तमान समय के आधार पर कुल संख्या की गणना करता है, जबकि 'getMaximum' केवल उस फ़ील्ड का अधिकतम मान देता है। तो 'getActualMaximum' वास्तव में इस प्रश्न का उत्तर है। – Yeti

+0

यह स्वीकार्य उत्तर होना चाहिए! –

1

@Manjula Weerasinge जवाब वास्तव में 2016 के लिए एक बग यहाँ एक बेहतर समाधान है परिचय।

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.MONTH, Calendar.JANUARY); 
cal.set(Calendar.DAY_OF_MONTH, 1); 
GregorianCalendar gregorianCalendar = new GregorianCalendar(); 

int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; 
if (gregorianCalendar.isLeapYear(year)){ 
    if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY) 
     return 53; 
    else 
     return 52; 
} else { 
    if (weekDay == Calendar.THURSDAY) 
     return 53; 
    else 
     return 52; 
} 
1

यह विधि जोडा समय पुस्तकालय का उपयोग कर आईएसओ वर्ष की संख्या की गणना करता है।

import org.joda.time.DateTime; 
    import org.joda.time.DateTimeZone; 

    public static int weeksInYear(int year) { 
     return new DateTime(DateTimeZone.forID("America/Los_Angeles")) 
      .withWeekyear(year + 1) 
      .withWeekOfWeekyear(1) 
      .minusWeeks(1) 
      .getWeekOfWeekyear(); 
    } 
संबंधित मुद्दे