জাভাতে কিভাবে এক বছরের মোট সপ্তাহগুলি খুঁজে পাবেন?


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/...
ফেদেরিকো klez Culloca

1
আপনার এক সপ্তাহের সংজ্ঞা সরবরাহ করার পরামর্শ দিন।
অ্যান্ডি

4
এটা তোলে 2020. দয়া করে বিরক্তিজনক পুরাতন উত্তরাধিকার তারিখ API প্রায় ব্যবহার করবেন না হয় Dateএবং Calendarjava.timeপরিবর্তে ব্যবহার করুন, এটি অনেক ভাল এবং সহজ।
জাবুজার্ড

যদি (বছরটি লিপ হয়) এবং (1 জানুয়ারী রবিবার হয়) তবে 54 অন্য 53.
আকিনা

আপনি আমাকে কিছু কোড দিতে পারেন?
কুমারসান পেরুমাল ২

উত্তর:


7

এখানে উইকিপিডিয়া সংজ্ঞা ব্যবহার করে । প্রথম জন বৃহস্পতিবার বা এক 31 শে ডিসেম্বর বৃহস্পতিবার হলে এক বছরের মধ্যে 53 সপ্তাহ থাকে, অন্যথায় এটি 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;

বছরের সর্বাধিক সপ্তাহে। আমি মনে করি @ নমনকে ৫৪ সপ্তাহ নেই বলে আমি মনে করি এটি সঠিক সমাধান লোকালডেট.ওফ (i, 1, 1) range ()
কুমারসান পেরুমাল

1
এটি 2021 এর জন্য 53 সপ্তাহ দেয় I আমি মনে করি এটি ভুল। দয়া করে এটি পরীক্ষা করুন
কুমারসান পেরুমাল

1
@ কুমারসান পেরুমাল আপনি কি নিশ্চিত?
সুইপার

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

"সপ্তাহ" সংজ্ঞায়িত করুন

আপনি একটি সপ্তাহ নির্ধারণ করতে হবে। আপনার কোডের নমুনায়, সপ্তাহের সংজ্ঞাটি জেভিএমের বর্তমান ডিফল্ট অনুসারে পরিবর্তিত হয় Locale। সুতরাং আপনার ফলাফল রানটাইমে পৃথক হতে পারে।

আপনার কোডটিতে ভয়াবহ তারিখ-কালীন ক্লাসগুলিও ব্যবহার করা হয়েছে যা আধুনিক জাভা.টাইম ক্লাসগুলি দ্বারা বছর আগে পূর্বে সরবরাহ করা হয়েছিল । ব্যবহার করা বন্ধ করুন GregorianCalendar& Calendar; তারা ভাল কারণে প্রতিস্থাপন করা হয়েছিল।

আইএসও 8601 সপ্তাহ

আইএসও 8601 মান এক সপ্তাহ সংজ্ঞায়িত হিসাবে:

  • সপ্তাহ সোমবার থেকে শুরু হয় , রবিবার শেষ হয়।
  • # 1 সপ্তাহে ক্যালেন্ডার-বছরের প্রথম বৃহস্পতিবার রয়েছে।

এই সংজ্ঞাটির অর্থ:

  • সপ্তাহ-ভিত্তিক-বছরের প্রথম এবং শেষ কয়েক দিনগুলি পূর্ববর্তী / পরবর্তী ক্যালেন্ডার-বছরের অগ্রবর্তী / অগ্রণী দিন হতে পারে।
  • সপ্তাহ ভিত্তিক বছরে হয় 52 বা 53 সম্পূর্ণ সপ্তাহ থাকে।

আপনার সংজ্ঞাটি পৃথক হলে ওলে ভিভি দ্বারা উত্তর দেখুন ।

YearWeek:is53WeekYear

যদি এটি আপনার সংজ্ঞাটির সাথে মেলে, তবে জাভা 8 এবং তার পরে নির্মিত জাভা.টাইম কার্যকারিতাটি প্রসারিত করতে আপনার প্রকল্পে থ্রিটেন-অতিরিক্ত লাইব্রেরি যুক্ত করুন । তারপরে আপনার ক্লাসে অ্যাক্সেস রয়েছে ।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

২০২০-এর সপ্তাহ-ভিত্তিক-বছরের প্রথম দিনটি ক্যালেন্ডার-বছর 2019 থেকে কীভাবে তা লক্ষ্য করুন।


আমি ভারতে. আমি কি দেশের নাম উল্লেখ করব?
কুমারসান পেরুমাল

@ কুমারসান পেরুমল না, টাইমজোনটি এখানে রয়েছে now। যেহেতু আপনি বর্তমান বছরের পরিবর্তে একটি নির্দিষ্ট বছরের জন্য সপ্তাহের গণনা পেতে চান, কেবল ব্যবহার করুন YearWeek.of(yourYear, 1)
সুইপার

ঠিক আছে আপনাকে ধন্যবাদ @ সুইপার আমি এটি ব্যবহার করব
কুমারসান পেরুমাল

@ কুমারসান পেরুমাল উইকিপিডিয়া টাইম জোনের নামের এই তালিকাটি রাখে । সামান্য পুরানো হতে পারে। যতদূর আমি জানি, সমস্ত ভারতবর্ষ টাইম অঞ্চলটি 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 সপ্তাহের প্রয়োজন হবে তবে আমি মনে করি আপনার সুইপ এবং বাসিল বাউরকের একটি উত্তরের সাথে যাওয়া উচিত । আপনার যদি আরও বেশি নমনীয় সমাধানের প্রয়োজন হয় যা অন্যান্য সপ্তাহের নম্বরকরণ প্রকল্পগুলির সাথেও কাজ করে তবে আমি এটি পোস্ট করেছি।

জাভা.টাইম ব্যবহার করুন

আপনার প্রশ্নের কোডটি মজার বিষয় যে এটি জোদা-সময় এবং জাভা.টাইম থেকে উভয়ই ক্লাস আমদানি করে, তবুও পুরাতন Calendarএবং GregorianCalendarজাভা ১.১ ব্যবহার করে । এই ক্লাসগুলি দুর্বলভাবে ডিজাইন করা হয়েছিল এবং এখন দীর্ঘকালীন, আপনার সেগুলি ব্যবহার করা উচিত নয়। জোদা-সময় রক্ষণাবেক্ষণ মোডে রয়েছে, জাভা.টাইম এর পরে এটি গ্রহণ করেছে। যা আমি ব্যবহার করি এবং আপনার ব্যবহারের পরামর্শ দিই।


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

জাভাতে অনেক চেষ্টা করার পরেও আমি কোনও সমাধান খুঁজে পেলাম না। তারপরে আমি জোদার তারিখ এবং সময় নির্ভরতা প্রস্তুত করেছি। আমি যেমনটি প্রত্যাশা করছিলাম তেমন এটি আমাকে একটি ভাল উত্তর দিয়েছে

কোড:

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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.