जावा में एक वर्ष के कुल सप्ताह कैसे लगाएं?


11

मैं एक प्रोजेक्ट पर काम कर रहा हूं। वहां मुझे एक वर्ष के कुल सप्ताह का पता लगाना चाहिए। मैंने निम्नलिखित कोड के साथ प्रयास किया, लेकिन मुझे गलत उत्तर मिला: 2020 में 53 सप्ताह हैं, लेकिन यह कोड 52 सप्ताह देता है।

इस कोड में मैं कहां गलत हो गया हूं?

package com.hib.mapping;

import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.joda.time.DateTime;

public class TestWeek {

    public static void main(String args[]) {
        System.out.println(getWeeks());
    }

    public static int getWeeks() {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 2020);
        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(2020)) {
            if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
                return 53;
            else
                return 52;
        } else {
            if (weekDay == Calendar.THURSDAY)
                return 53;
            else
                return 52;
        }

    }

}

आउटपुट:

52


1
बिल्कुल डुप्लिकेट नहीं है, लेकिन पढ़ने का सुझाव दिया गया: stackoverflow.com/questions/44197872/…
Federico klez Culloca

1
एक सप्ताह की अपनी परिभाषा प्रदान करने का सुझाव दें।
एंडी

4
यह 2020 है। कृपया पुरानी पुरानी विरासत की तारीखों के बारे में एपि Dateऔर आसपास के उपयोग से बचें Calendarjava.timeइसके बजाय उपयोग करें , यह बहुत बेहतर और सरल है।
ज़बुज़ार्ड

यदि (वर्ष लीप है) और (1 जनवरी रविवार है) तो 54 और 53.
अकिना

क्या आप मुझे कुछ कोड दे सकते हैं?
कुमारसैन पेरुमल

जवाबों:


7

यहाँ विकिपीडिया की परिभाषा का उपयोग करना । एक वर्ष में 53 सप्ताह होते हैं यदि 1 जनवरी गुरुवार है, या 31 दिसंबर एक गुरुवार है, अन्यथा इसमें 52 सप्ताह हैं। यह परिभाषा आपके द्वारा उपयोग किए जाने वाले के बराबर है। मुझे लगता है कि यह जाँच करने का एक आसान तरीका है, क्योंकि आपको लीप वर्ष के लिए जाँच करने की आवश्यकता नहीं है।

जावा 8 java.timeएपीआई का उपयोग करना :

int year = 2020;
boolean is53weekYear = LocalDate.of(year, 1, 1).getDayOfWeek() == DayOfWeek.THURSDAY ||
        LocalDate.of(year, 12, 31).getDayOfWeek() == DayOfWeek.THURSDAY;
int weekCount = is53weekYear ? 53 : 52;

वर्ष का अधिकतम सप्ताह ५३। मुझे लगता है कि यह अच्छा है @ नमन कोई ५४ सप्ताह हैं, मुझे लगता है कि सही समाधान लोकल डेटेट (आईएफ, १, १) है। ()
कुमारसैन पेरुमल

1
यह 2021 के लिए 53 सप्ताह देता है। मुझे लगता है कि यह गलत है। कृपया इसका परीक्षण करें
कुमारसन पेरुमल


1
हाँ, यह काम कर रहा है। मैं 100 साल के साथ परीक्षण करूंगा, फिर आपको बताऊंगा। आपके प्रयास के लिए धन्यवाद
कुमारेसन पेरुमल

1
मैंने JDK 1.8.0_101 और 1.8.0_121 पर परीक्षण किया है। अभी भी 2021 में 52 सप्ताह मिल रहे हैं जैसा हमें होना चाहिए।
ओले वीवी

7

tl; डॉ

एक मानक आईएसओ 8601 सप्ताह के लिए, तृतीयक-अतिरिक्त पुस्तकालय से एक वर्गीय कथन के साथ YearWeekकक्षा का उपयोग करें ।

YearWeek          // Represents an entire week of a week-based-year.
.of( 2020 , 1 )   // Pass the number of the week-based-year (*not* calendar year), and a week number ranging from 1 to 52 or 1 to 53.
.is53WeekYear()   // Every standard week-based-year has either 52 or 52 complete weeks.
? 53              // Ternary statement returns 53 if the predicate returns True, …
: 52              // … otherwise returns 52. 

अर्थात्, YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52

"सप्ताह" परिभाषित करें

आपको एक सप्ताह परिभाषित करने की आवश्यकता है। आपके कोड नमूने में, सप्ताह की परिभाषा JVM के वर्तमान डिफ़ॉल्ट द्वारा भिन्न होती है Locale। तो आपके परिणाम रनटाइम पर भिन्न हो सकते हैं।

आपका कोड भयानक तारीख-समय की कक्षाओं का भी उपयोग करता है जो आधुनिक जावा.टाइम कक्षाओं द्वारा वर्षों पहले दबाए गए थे । उपयोग बंद करो GregorianCalendar& Calendar; उन्हें अच्छे कारणों से बदल दिया गया।

आईएसओ 8601 सप्ताह

आईएसओ 8601 मानक एक सप्ताह को परिभाषित करता है के रूप में:

  • सप्ताह सोमवार से शुरू होता है , रविवार को समाप्त होता है।
  • सप्ताह # 1 में कैलेंडर-वर्ष का पहला गुरुवार है।

उस परिभाषा का अर्थ है:

  • सप्ताह-आधारित वर्ष के पहले और अंतिम दिन पिछले / निम्नलिखित कैलेंडर-वर्ष के अनुगामी / अग्रणी दिन हो सकते हैं।
  • सप्ताह आधारित वर्ष में या तो 52 या 53 पूर्ण सप्ताह हैं।

यदि आपकी परिभाषा भिन्न है, तो Ole VV द्वारा उत्तर देखें ।

YearWeek:is53WeekYear

यदि यह आपकी परिभाषा से मेल खाता है, तो जावा 8 और बाद में निर्मित java.time कार्यक्षमता का विस्तार करने के लिए अपनी परियोजना में थ्रीटेन-अतिरिक्त पुस्तकालय जोड़ें । आप तब कक्षा में पहुँच सकते हैं ।YearWeek

ZoneId z = ZoneId.of( "America/Montreal" ) ;
YearWeek yearWeekNow = YearWeek.now( z ) ;
boolean is53WeekYear = yearWeekNow.is53WeekYear() ;

int weeksLong = yearWeekNow.is53WeekYear() ? 53 : 52 ;

किसी विशेष सप्ताह-आधारित वर्ष के बारे में पूछने के लिए, बस मनमाने ढंग से वर्ष के किसी भी सप्ताह को चुनें। उदाहरण के लिए, सप्ताह आधारित वर्ष 2020 के लिए हम सप्ताह # 1 के लिए पूछते हैं।

int weeksLong = YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52 ;
LocalDate weekStart = YearWeek.of( 2020 , 1 ).atDay( DayOfWeek.MONDAY ) ;

सप्ताहलॉन्ग = 53

सप्ताहस्टार्ट = 2019-12-30

ध्यान दें कि 2020 के सप्ताह-आधारित वर्ष का पहला दिन कैलेंडर-वर्ष 2019 से कैसा है।


मैं भारत में हूँ। क्या मुझे देश का नाम निर्दिष्ट करना चाहिए?
कुमारसन पेरुमल

@ कुमारसैनपेरुमल नहीं, इसके लिए समय-क्षेत्र है now। चूंकि आप वर्तमान वर्ष के बजाय एक विशिष्ट वर्ष के लिए सप्ताह की गिनती प्राप्त करना चाहते हैं, बस उपयोग करें YearWeek.of(yourYear, 1)
स्वीपर

ok धन्यवाद @sweeper मैं इसका उपयोग करूंगा
पेरुमल

@ कुमारसैनपेरुमल विकिपीडिया समय क्षेत्र नामों की इस सूची को रखता है । थोड़ा बाहर हो सकता है। जहां तक ​​मुझे पता है, सभी भारत समय क्षेत्र का उपयोग करता है Asia/Kolkata, वर्तमान में +05: 30 की भरपाई के साथ है। जावा कोड में: ZoneId.of( "Asia/Kolkata" )। अधिक जानकारी और इतिहास के लिए, भारत में विकिपीडिया, समय देखें ।
बेसिल बोर्क

4

लचीला समाधान

यह किसी भी सप्ताह अंक योजना के लिए काम करना चाहिए जिसे किसी WeekFieldsवस्तु में दर्शाया जा सकता है ।

public static int noOfWeeks(WeekFields wf, int year) {
    LocalDate lastDayOfYear = YearMonth.of(year, Month.DECEMBER).atEndOfMonth();
    if (lastDayOfYear.get(wf.weekBasedYear()) > year) { // belongs to following week year
        return lastDayOfYear.minusWeeks(1).get(wf.weekOfWeekBasedYear());
    }
    else {
        return lastDayOfYear.get(wf.weekOfWeekBasedYear());
    }
}

विचार के आधार पर सप्ताह के अंतिम सप्ताह के सप्ताह की संख्या का पता लगाना है। मैं 31 दिसंबर के साथ पहले प्रयास करता हूं, लेकिन अगले वर्ष के पहले सप्ताह में हो सकता है। यदि हां, तो मैं एक सप्ताह पहले जाता हूं।

मैंने WeekFields.ISOअन्य WeekFieldsवस्तुओं के साथ बहुत अच्छी तरह से परीक्षण नहीं किया है , लेकिन जैसा कि मैंने कहा, मेरा मानना ​​है कि यह काम करता है।

यदि आप एक तथ्य के लिए जानते हैं कि आपको हमेशा आईएसओ 8601 सप्ताह की आवश्यकता होगी , तो मुझे लगता है कि आपको स्वीपर द्वारा और बेसिल बोर्क द्वारा अच्छे उत्तरों में से एक के साथ जाना चाहिए । मैंने इस मामले में पोस्ट किया है कि आपको एक और अधिक लचीली समाधान की आवश्यकता है जो अन्य सप्ताह की नंबरिंग योजनाओं के साथ भी काम करेगा।

Java.time का उपयोग करें

आपके प्रश्न में यह कोड मज़ेदार है कि यह Joda-Time और java.time से, दोनों वर्गों का आयात करता है, फिर भी पुराने Calendarऔर GregorianCalendarजावा 1.1 से उपयोग करता है । इन कक्षाओं को खराब तरीके से डिजाइन किया गया था और अब लंबे समय तक पुरानी हैं, तो आपको उनका उपयोग नहीं करना चाहिए। Joda-Time मेंटेनेंस मोड में है, java.time ने इसके बाद अपना पदभार संभाला है। जो मैं उपयोग करता हूं और आपको सलाह देता हूं कि आप इसका उपयोग करें।


1

मुझे लगता है कि यह भी ठीक काम करना चाहिए:

int year = 2020;
long numOfWeeks = LocalDate.of(year, 1, 1).datesUntil(LocalDate.of(year, 12, 31), Period.ofDays(7)).count();
System.out.println("Weeks: " + numOfWeeks);

अच्छा विचार। यह 2020 (53 सप्ताह) के साथ-साथ 2019 और 2021 (52 सप्ताह प्रत्येक) के लिए सही परिणाम देता है। हालाँकि खुद को समझाना थोड़ा मुश्किल हो सकता है।
ओले वीवी

यह सभी छलांग वर्षों के लिए 53 सप्ताह का समय देता है, हालांकि, यह सही नहीं है।
ओले वीवी

@ OleV.V। हम्म, काफी अच्छा है। मैं उत्सुक हूं कि स्थानीय हुड की गणना कैसे हुड के तहत काम करती है। बेवकूफ पृथ्वी और यह थोड़ा अपूर्ण समय चक्र है, चीजों को और अधिक जटिल बना देता है जितना कि उन्हें होना चाहिए।
टिम हंटर


0

जावा 8. में बहुत कोशिश करने के बाद भी मुझे कोई हल नहीं मिला। फिर मैंने जोडा की तारीख और समय पर निर्भरता तैयार की। मुझे उम्मीद के मुताबिक इसका अच्छा जवाब मिला

कोड:

for (int i = 2020; i < 2100; i++) {
  int weeks = new DateTime().withYear(i).weekOfWeekyear().getMaximumValue();
  System.out.println(i + " years : " + weeks); 
}

मावेन निर्भरता:

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.5</version>
</dependency>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.