মাস গণনার শেষ দিন


144

মাসের পরের দিনটি যখন প্রেরণের জন্য নির্ধারিত একটি বিজ্ঞপ্তির জন্য হয় তখন গণনা নিয়ে আমার সমস্যা হয়।

আমার কোডটি এখানে:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();

এটিই বিশ্বাস করি যে সমস্যাগুলির কারণ হ'ল:

nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), 
                  recurrenceFrequency.getRecurrenceOffset());

বিজ্ঞপ্তির জন্য আমি কীভাবে পরবর্তী মাসের শেষ দিনটি ঠিকঠাক করতে ক্যালেন্ডারটি ব্যবহার করতে পারি?


1
এটি পরের মাসের প্রথম দিনটিতে সেট করুন এবং তারপরে একদিন পিছনে রোল করুন।
বিল

একটি এসএসসিসিই এই প্রশ্নের উত্তর দেওয়া সহজ করে তুলবে। আসলে কী সমস্যা দেখছেন?
ডিএনএ

উত্তর:


347
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

এটি চলতি মাসের জন্য প্রকৃত সর্বোচ্চ দেয়। উদাহরণস্বরূপ এটি এখন লিপ ইয়ার ফেব্রুয়ারি, সুতরাং এটি 29 হিসাবে ফিরে আসে int


ধন্যবাদ, আমার পরবর্তী মাসের জন্য সর্বোচ্চটি অর্জন করা দরকার, তবে এখনও এটি কাজ করতে হবে যে এটি মাসের প্রথম দিনও হতে পারে, যে অংশটি এখন কাজ করে। আপনার সময় এবং প্রচেষ্টার জন্য আবার ধন্যবাদ
ওকভিল

4
ActualMaximumপ্রতিটি তারিখ পেতে এটি কোনও সমস্যা নয় । কল করার আগে প্রয়োজনীয় তারিখে কেবল ক্যালেন্ডার উদাহরণ রোল করুন getActualMaximum। প্রথম তারিখটি দ্বারা প্রাপ্ত করা যেতে পারেgetActualMinimum()
অ্যালেক্সার

ঠিক আছে অ্যালেক্সকে অনেক ধন্যবাদ, তাই যদি আমি উদাহরণটি এক মাস আগে রোল করতে চাই এবং সেই মাসের জন্য getActualMaximum জানতে পারি তবে আমি কীভাবে এটি করব? ?? চিয়ার্স
ওকভিল

এটি কি এটি অ্যালেক্স হবে? NextNotifTime.rol (ক্যালেন্ডার.মোন্থ, সত্য); nextNotifTime.getActualMaximum (Calendar.DAY_OF_MONTH);
ওকভিল

এছাড়াও আমি এই পর প্রস্তুত তারিখ সময় সেট: nextNotification.setReadyDateTime(nextNotifTime.getTime()); তাই আমি পরিবর্তে করা উচিত না: nextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH); ?
ওকভিল

61

java.time.temporal.TemporalAdjusters.lastDayOfMonth ()

java.timeজাভা 8 এ নির্মিত লাইব্রেরিটি ব্যবহার করে আপনি TemporalAdjusterইন্টারফেসটি ব্যবহার করতে পারেন । আমরা এ ব্যবহারের জন্য একটি বাস্তবায়ন প্রস্তুত এটি TemporalAdjustersইউটিলিটি শ্রেণী: lastDayOfMonth

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

LocalDate now = LocalDate.now(); //2015-11-23
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30

আপনার যদি সময়ের তথ্য যুক্ত করতে হয় তবে LocalDateআপনি LocalDateTimeরূপান্তর করতে যে কোনও উপলভ্য ব্যবহার করতে পারেন

lastDay.atStartOfDay(); //2015-11-30T00:00

ভাল উত্তর. তবে শেষ অংশটি দুর্বল, এর ব্যবহারের পরামর্শ দিচ্ছে LocalDateTime। এই শ্রেণিতে টাইম জোন বা অফসেট-ইউটিসি-এর কোনও ধারণার অভাব রয়েছে। সুতরাং নির্দিষ্ট স্থানে কোনও নির্দিষ্ট দিন কখন শুরু হয় তা নির্ধারণ করতে পারে না। এই শ্রেণিটি কেবল সাধারণ-সাধারণ দিনগুলিতে নয়, কেবল সাধারণ জেনেরিক 24 ঘন্টা কাজ করে। বাস্তব দিন ধরে কোন সময় জোন উল্লেখ করুন: ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;। কিছু জায়গায় কিছু দিন আলাদা সময়ে শুরু হতে পারে, যেমন ডাইলাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলির কারণে 01:00।
বেসিল Bourque

35

এবং তারিখ অবজেক্ট হিসাবে শেষ দিন পেতে:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));

Date lastDayOfMonth = cal.getTime();

22

আপনি পরের মাসের প্রথমটিতে ক্যালেন্ডার সেট করতে পারেন এবং তারপরে একটি দিন বিয়োগ করতে পারেন।

Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);

এই কোডটি চালনার পরের নোটিফটাইমটি চলতি মাসের শেষ দিনটিতে সেট করা হবে। মনে রাখবেন আজ যদি এই মাসের শেষ দিন হয় তবে এই কোডের নেট এফেক্টটি হ'ল ক্যালেন্ডার অবজেক্ট অপরিবর্তিত রয়েছে।


17

নিম্নলিখিতগুলি সর্বদা যথাযথ ফলাফল দেয়:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, ANY_MONTH);
    cal.set(Calendar.YEAR, ANY_YEAR);
    cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
    cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
    cal.getTime();

কেন এটি প্রয়োজনীয়? আপনি আমাকে বলতে পারেন :)
ফ্র্যাঙ্ক ফ্যাং

1
হ্যাঁ, উপরের এই ঠিক কারণে পরীক্ষাগুলি ব্যর্থ হয়েছে। সমস্যাটি হ'ল যদি DAY_OF_MONTH সেট না করা হয় তবে এটি বর্তমানের ডিফল্ট হবে।
পিয়ারসি

7

java.timeএখানে সর্বশেষতম লাইব্রেরি ব্যবহার করা সর্বোত্তম সমাধান:

LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());

বিকল্পভাবে, আপনি এটি করতে পারেন:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());


2

getActualMaximum(int field)ক্যালেন্ডার অবজেক্টের পদ্ধতিটি দেখুন ।

আপনি যদি আপনার ক্যালেন্ডার অবজেক্টটি সেই মাসে রাখেন যার জন্য আপনি শেষ তারিখটি খুঁজছেন, তবে getActualMaximum(Calendar.DAY_OF_MONTH)আপনাকে শেষ দিনটি দেবে।


2
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date date = sdf.parse("11/02/2016");

        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(date);  

        System.out.println("First Day Of Month : " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH));  
        System.out.println("Last Day of Month  : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 

1

কোটলিন তারিখ এক্সটেনশন বাস্তবায়ন ব্যবহার করে java.util.Calendar

fun Date.toEndOfMonth(): Date {
    return Calendar.getInstance().apply {
        time = this@toEndOfMonth
    }.toEndOfMonth().time
}

fun Calendar.toEndOfMonth(): Calendar {
    set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))
    return this
}

আপনি toEndOfMonthযেমন প্রতিটি তারিখ অবজেক্টে ফাংশন কল করতে পারেনDate().toEndOfMonth()


4
এই জঘন্য ক্লাসগুলি বহু বছর আগে জেএসআর 310 গ্রহণের সাথে আধুনিক জাভা.টাইম ক্লাসগুলির দ্বারা দমন করা হয়েছিল 2019 2019 সালে এই উত্তরাধিকার শ্রেণিগুলির পরামর্শ দেওয়া দুর্বল পরামর্শ।
বেসিল বাউর্কে

এটি কোনও খারাপ পরামর্শ নয়। আধুনিক জাভা.টাইম Android এর জন্য কেবলমাত্র API 26+ এর জন্য উপলব্ধ। আমরা এখনও java.util। * উপর নির্ভর করি যখন পুরানো ডিভাইসগুলিকে সমর্থন করে (তখন না)।
রাফায়েল ছাগাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.