জাভাতে তারিখের পরিসীমা দিয়ে পুনরাবৃত্তি কীভাবে করবেন?


144

আমার স্ক্রিপ্টে আমার একটি সূচনা এবং শেষের তারিখের সাথে তারিখের বিস্তারের মাধ্যমে ক্রিয়াকলাপগুলির একটি সেট করা দরকার।
জাভা ব্যবহার করে এটি অর্জনের জন্য দয়া করে আমাকে গাইডেন্স সরবরাহ করুন।

for ( currentDate = starDate; currentDate < endDate; currentDate++) {

}

আমি জানি যে উপরের কোডটি কেবল অসম্ভব, তবে আমি কী অর্জন করতে চাই তা আপনাকে প্রদর্শন করতে আমি এটি করি।


জাভা 8 এবং 9 পরিষ্কার দৃষ্টীকোণ: stackoverflow.com/a/51942109/1216775
akhil_mittal

উত্তর:


198

ঠিক আছে, আপনি জাভা 8-র টাইম-এপিআই ব্যবহার করে বিশেষত java.time.LocalDate(বা জাভা 7 এবং তার বেশি বয়সীদের সমতুল্য জোডা টাইম ক্লাস) ব্যবহার করে এমন কিছু করতে পারেন

for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1))
{
    ...
}

আমি বিল্ট-ইন / ক্লাসগুলির উপর (বা জোদা সময়) ব্যবহারের পুরোপুরি পরামর্শ দেব ।java.timeDateCalendar


2
জোদা সময় সম্পর্কে এই বিষয়টিকে প্রসারিত করার জন্য: গ্রীষ্মের সময় ও পরিবর্তনের পরিবর্তে কোণঠাসা মামলার কারণে কারও পক্ষে যতটা মনে করা যায় তার থেকে নিজেকে এটি সঠিকভাবে প্রয়োগ করার চেষ্টা করা আরও শক্ত।
রায়েডওয়াল্ড

জোড়ার জন্য +1, আমি আশা করি কোনও দিন এটি স্ট্যান্ডার্ড এপিআইতে পৌঁছে যাবে।
গাইর্জ্যাব্রাহাম

4
@ গ্যাব্রাহাম: জেএসআর -310 জাভা 8
জোন স্কিচ

4
এই ঠিক একই কোডটি জাডার পরিবর্তে জাভা 8 এর জাভা.টাইম.লোকলডেট ব্যবহার করে কাজ করবে তা নিশ্চিত করতে পারে।
গলিত বরফ

3
জোডা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণ মোডে রয়েছে এবং জাভা.টাইম ক্লাসে স্থানান্তরের প্রস্তাব দেয়। মন্তব্যে উল্লিখিত হিসাবে, এই জবাবের কোডটি জাভা.টাইমে যেমন রয়েছে তেমন কাজ করে, কেবল আপনার importবিবৃতি পরিবর্তন করুন ।
বাসিল বাউরক

146

জোদাটাইম পুরোপুরি এবং / অথবা আপনি যদি API- সরবরাহিত সুবিধাগুলি পছন্দ করেন তবে এখানে স্ট্যান্ডার্ড এপিআই পদ্ধতির জন্য দুর্দান্ত is

java.util.Dateনীচের মত দৃষ্টান্ত দিয়ে শুরু করার সময় :

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = formatter.parse("2010-12-20");
Date endDate = formatter.parse("2010-12-26");

java.util.Calendarআপনি এখনও জাভা 8 এ না থাকলে ক্ষেত্রে লিগ্যাসি পদ্ধতির বিষয়টি এখানে :

Calendar start = Calendar.getInstance();
start.setTime(startDate);
Calendar end = Calendar.getInstance();
end.setTime(endDate);

for (Date date = start.getTime(); start.before(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
    // Do your job here with `date`.
    System.out.println(date);
}

এবং এখানে জাভা 8 এর java.time.LocalDateপদ্ধতির মূলত জোডটাইম পদ্ধতির:

LocalDate start = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate end = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {
    // Do your job here with `date`.
    System.out.println(date);
}

যদি আপনি সমাপ্তির তারিখ সমেত পুনরাবৃত্তি করতে চান তবে যথাক্রমে !start.after(end)এবং ব্যবহার করুন !date.isAfter(end)


75

জাভা 8 স্টাইল, জাভা.টাইম ক্লাস ব্যবহার করে :

// Monday, February 29 is a leap day in 2016 (otherwise, February only has 28 days)
LocalDate start = LocalDate.parse("2016-02-28"),
          end   = LocalDate.parse("2016-03-02");

// 4 days between (end is inclusive in this example)
Stream.iterate(start, date -> date.plusDays(1))
        .limit(ChronoUnit.DAYS.between(start, end) + 1)
        .forEach(System.out::println);

আউটপুট:

2016-02-28
2016-02-29
2016-03-01
2016-03-02

বিকল্প:

LocalDate next = start.minusDays(1);
while ((next = next.plusDays(1)).isBefore(end.plusDays(1))) {
    System.out.println(next);
}

জাভা 9 তারিখগুলি যোগ করেছে () পদ্ধতি:

start.datesUntil(end.plusDays(1)).forEach(System.out::println);

1
আপনি বহুগুণ মান রাখতে পারেন? উদাহরণস্বরূপ: কেবল সোমবার বা বৃহস্পতিবার বা উভয়ই
বিতরণ করুন

26

এটি মূলত বালুসসি একই উত্তরটি দিয়েছে তবে লুপের জন্য কিছুক্ষণ লুপের সাথে আরও কিছুটা পাঠযোগ্য:

Calendar start = Calendar.getInstance();
start.setTime(startDate);

Calendar end = Calendar.getInstance();
end.setTime(endDate);

while( !start.after(end)){
    Date targetDay = start.getTime();
    // Do Work Here

    start.add(Calendar.DATE, 1);
}

3
লজিকটিতে "চালিয়ে" বিবৃতি জড়িত থাকলে এটি কাজ করবে না, যখন বালাসকের লুপ সংস্করণটি অবিরত বিবৃতিগুলির সাথে কাজ করে।
সানজিভ জীবন

6

অ্যাপাচি কমন্স

    for (Date dateIter = fromDate; !dateIter.after(toDate); dateIter = DateUtils.addDays(dateIter, 1)) {
        // ...
    }

+1, আইএমএইচও, আপনি পুরানো কোড নিয়ে কাজ করার সময় এটি সবচেয়ে পরিষ্কার। এর জন্য কেবল অতিরিক্ত স্ট্যাটিক আমদানি addDays(..)ফেলুন এবং এটি আরও খাটো হয়ে যায়।
প্রিয়দু নিমরে

4
private static void iterateBetweenDates(Date startDate, Date endDate) {
    Calendar startCalender = Calendar.getInstance();
    startCalender.setTime(startDate);
    Calendar endCalendar = Calendar.getInstance();
    endCalendar.setTime(endDate);

    for(; startCalender.compareTo(endCalendar)<=0;
          startCalender.add(Calendar.DATE, 1)) {
        // write your main logic here
    }

}

3
public static final void generateRange(final Date dateFrom, final Date dateTo)
{
    final Calendar current = Calendar.getInstance();
    current.setTime(dateFrom);

    while (!current.getTime().after(dateTo))
    {
        // TODO

        current.add(Calendar.DATE, 1);
    }
}

3

আমরা যুক্তিটি বিভিন্ন পদ্ধতিতে জাভা 7, জাভা 8 এবং জাভা 9 এ স্থানান্তর করতে পারি :

public static List<Date> getDatesRangeJava7(Date startDate, Date endDate) {
    List<Date> datesInRange = new ArrayList<>();
    Calendar startCalendar = new GregorianCalendar();
    startCalendar.setTime(startDate);
    Calendar endCalendar = new GregorianCalendar();
    endCalendar.setTime(endDate);
    while (startCalendar.before(endCalendar)) {
        Date result = startCalendar.getTime();
        datesInRange.add(result);
        startCalendar.add(Calendar.DATE, 1);
    }
    return datesInRange;
}

public static List<LocalDate> getDatesRangeJava8(LocalDate startDate, LocalDate endDate) {
    int numOfDays = (int) ChronoUnit.DAYS.between(startDate, endDate);
    return IntStream.range(0, numOfDays)
            .mapToObj(startDate::plusDays)
            .collect(Collectors.toList());
}

public static List<LocalDate> getDatesRangeJava9(LocalDate startDate, LocalDate endDate) {
    return startDate.datesUntil(endDate).collect(Collectors.toList());
}

তারপরে আমরা এই পদ্ধতিগুলি এইভাবে প্রার্থনা করতে পারি:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = formatter.parse("2010-12-20");
Date endDate = formatter.parse("2010-12-26");
List<Date> dateRangeList = getDatesRangeJava7(startDate, endDate);
System.out.println(dateRangeList);

LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
List<LocalDate> dateRangeList8 = getDatesRangeJava8(startLocalDate, endLocalDate);
System.out.println(dateRangeList8);
List<LocalDate> dateRangeList9 = getDatesRangeJava8(startLocalDate, endLocalDate);
System.out.println(dateRangeList9);

আউটপুটটি হবে:

[সোমবার 20 ডিসেম্বর 00:00:00 IST 2010, মঙ্গলবার 21 ডিসেম্বর 00:00:00 IST 2010, বুধ ডিসেম্বর 22 00:00:00 IST 2010, থু ডিসেম্বর 23 00:00:00 IST 2010, শুক্র ডিসেম্বর 24 00: 00:00 IST 2010, শনিবার 25 ডিসেম্বর 00:00:00 IST 2010]

[2010-12-22, 2010-12-21, 2010-12-22, 2010-12-23, 2010-12-24, 2010-12-25]

[2010-12-22, 2010-12-21, 2010-12-22, 2010-12-23, 2010-12-24, 2010-12-25]


1
ভয়াবহ Dateএবং Calendarক্লাসগুলি জাভা.টাইম ক্লাসগুলি বহু বছর আগে দমন করেছিল । বিশেষত, দ্বারা প্রতিস্থাপিত Instantএবং ZonedDateDate
তুলসী বাউরকে

1
আমি জাভা 8 এবং 9 টি পছন্দ করি। জাভা 6 এবং 7 এর জন্য আমি থ্রিটেন ব্যাকপোর্ট লাইব্রেরিটি ব্যবহার করার পরামর্শ দিই এবং তার পরে জাভা ৮ এর মতোই You
ওলে ভিভি

2

এখানে জাভা 8 কোড রয়েছে। আমি মনে করি এই কোডটি আপনার সমস্যার সমাধান করবে। শুভ কোডিং

    LocalDate start = LocalDate.now();
    LocalDate end = LocalDate.of(2016, 9, 1);//JAVA 9 release date
    Long duration = start.until(end, ChronoUnit.DAYS);
    System.out.println(duration);
     // Do Any stuff Here there after
    IntStream.iterate(0, i -> i + 1)
             .limit(duration)
             .forEach((i) -> {});
     //old way of iteration
    for (int i = 0; i < duration; i++)
     System.out.print("" + i);// Do Any stuff Here

এটি সর্বোত্তম এবং সহজ পদ্ধতির যা আপনি অনুসরণ করতে পারেন।
যতীন গোয়াল

1

কেন সহজেই পর্ব এবং লুপ ব্যবহার করবেন না।

long startDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(startDate).getTime() / 1000;

    long endDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(endDate).getTime() / 1000;


    long i;
    for(i=startDateEpoch ; i<=endDateEpoch; i+=86400){

        System.out.println(i);

    }

1

আপনি এটির মতো ক্লাস লিখতে পারেন (পুনরাবৃত্ত ইন্টারফেস প্রয়োগ করে) এবং এটিতে পুনরাবৃত্তি করতে পারেন।

public class DateIterator implements Iterator<Date>, Iterable<Date>
{

 private Calendar end = Calendar.getInstance();
 private Calendar current = Calendar.getInstance();

 public DateIterator(Date start, Date end)
 {
     this.end.setTime(end);
     this.end.add(Calendar.DATE, -1);
     this.current.setTime(start);
     this.current.add(Calendar.DATE, -1);
 }

 @Override
 public boolean hasNext()
 {
     return !current.after(end);
 }

 @Override
 public Date next()
 {
     current.add(Calendar.DATE, 1);
     return current.getTime();
 }

 @Override
 public void remove()
 {
     throw new UnsupportedOperationException(
        "Cannot remove");
 }

 @Override
 public Iterator<Date> iterator()
 {
     return this;
 }
}

এবং এটি ব্যবহার করুন:

Iterator<Date> dateIterator = new DateIterator(startDate, endDate);
while(dateIterator.hasNext()){
      Date selectedDate = dateIterator .next();

}

1

আপনি এটি চেষ্টা করতে পারেন:

OffsetDateTime currentDateTime = OffsetDateTime.now();
for (OffsetDateTime date = currentDateTime; date.isAfter(currentDateTime.minusYears(YEARS)); date = date.minusWeeks(1))
{
    ...
}

0

এটি আপনাকে 30 দিন পিছনে শুরু করতে এবং আজকের তারিখ পর্যন্ত লুপটি করতে সহায়তা করবে। আপনি সহজেই তারিখ এবং দিকের পরিসর পরিবর্তন করতে পারেন।

private void iterateThroughDates() throws Exception {
    Calendar start = Calendar.getInstance();
    start.add(Calendar.DATE, -30);
    Calendar end = Calendar.getInstance();
    for (Calendar date = start; date.before(end); date.add(Calendar.DATE, 1))
        {
        System.out.println(date.getTime());
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.