2010-12-26 10 views
93

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

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

} 

मुझे पता है कि उपरोक्त कोड बस असंभव है, लेकिन मैं आपको यह दिखाने के लिए करता हूं कि मैं क्या हासिल करना चाहता हूं।

उत्तर

132

ठीक है, आप अच्छी तरह से मैं Joda समय का उपयोग करना चाहिये को लेकर कुछ इस तरह (Joda Time का उपयोग कर)

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

कर सकता है निर्मित Date/Calendar कक्षाएं।

+3

धन्यवाद आदमी, मैं देना है आप एक –

+1

Joda समय के बारे में बात पर विस्तार करने के लिए: सही ढंग से इस लागू करने के लिए अपने आप को कठिन से एक कोने की वजह से सोच सकते हैं है की कोशिश कर रहा ग्रीष्मकालीन समय में और उसके आसपास के बदलावों के मामले। जोडा समय के लिए – Raedwald

+0

+1! – PaulP1975

114

जोडाटाइम अच्छा है, हालांकि, पूर्णता के लिए और/या यदि आप एपीआई द्वारा प्रदान की जाने वाली सुविधाओं को प्राथमिकता देते हैं, तो यहां मानक एपीआई दृष्टिकोण हैं।

जब 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 दृष्टिकोण आप Java8 पर अभी तक नहीं कर रहे हैं:

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); 
} 

और यहाँ Java8 के 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) का उपयोग करें।

22

यह अनिवार्य रूप से एक ही जवाब BalusC दिया थोड़ा अधिक पाश के लिए एक के स्थान पर थोड़ी देर के पाश के साथ पढ़ी जा सकती है, लेकिन:

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

यह तर्क नहीं करेगा यदि तर्क में "जारी रखें" बयान शामिल है, जबकि बलुस के लूप संस्करण जारी बयान के साथ काम करता है। –

2
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 
    } 

} 
0

अपाचे कॉमन्स

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

जावा java.time कक्षाओं का उपयोग करते हुए 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); 
} 
+0

क्या आप गुणक मान डाल सकते हैं? उदाहरण के लिए: केवल सोमवार या गुरुवार या – delive

-1

यहाँ जावा 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 
+0

यह सबसे अच्छा और आसान तरीका है जिसका आप अनुसरण कर सकते हैं। –

2
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); 
    } 
} 
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()); 
     } 
} 
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); 

    } 
0

आप इस तरह की एक कक्षा (इटरेटर इंटरफेस को कार्यान्वित करना) लिख सकते हैं और इसके ऊपर फिर से लिख सकते हैं।

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(); 

}