如何获取java中两个日期之间的日期列表

Ari*_*020 62 java date

我想要一个开始日期和结束日期之间的日期列表.

结果应该是所有日期的列表,包括开始日期和结束日期.

Alb*_*ert 49

早在2010年,我建议使用Joda-Time.

请注意,Joda-Time现在处于维护模式.从1.8(2014)开始,您应该使用java.time.

一次添加一天,直到到达结束日期:

int days = Days.daysBetween(startDate, endDate).getDays();
List<LocalDate> dates = new ArrayList<LocalDate>(days);  // Set initial capacity to `days`.
for (int i=0; i < days; i++) {
    LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
    dates.add(d);
}
Run Code Online (Sandbox Code Playgroud)

实现自己的迭代器也不会太难,这样做会更好.

  • **提示**通过调用[`plusDays`]简化代码(http://www.joda.org/joda-time/apidocs/org/joda/time/LocalDate.html#plusDays(int)).所以这个`LocalDate d = startDate.withFieldAdded(DurationFieldType.days(),i);`因为这个`LocalDate d = startDate.plusDays(i);` (10认同)
  • jodaTime太棒了! (2认同)

Yad*_*nan 39

java.time包

如果您使用的是Java 8,那么有一种更清晰的方法.Java 8中的新java.time包结合了Joda-Time API的功能.

您的要求可以使用以下代码解决:

String s = "2014-05-01";
String e = "2014-05-10";
LocalDate start = LocalDate.parse(s);
LocalDate end = LocalDate.parse(e);
List<LocalDate> totalDates = new ArrayList<>();
while (!start.isAfter(end)) {
    totalDates.add(start);
    start = start.plusDays(1);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,Java 9使用`Stream <LocalDate>`更容易使用`LocalDate`,从而无需构建自己的`while`循环.参见[Hochschild的回答](http://stackoverflow.com/a/35892853/642706). (2认同)

小智 38

获取日期之间的天数(包括日期).

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate)
{
    List<Date> dates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(startdate);

    while (calendar.getTime().before(enddate))
    {
        Date result = calendar.getTime();
        dates.add(result);
        calendar.add(Calendar.DATE, 1);
    }
    return dates;
}
Run Code Online (Sandbox Code Playgroud)

  • 一般情况下,当你使用`before()`方法(等于<operation)时,最终列表将不包括`fechaFinal`(结束日期).而是应该使用<=操作.由于`Calendar`类中没有等效方法,因此您应该稍微增加结束日期. (3认同)

Ami*_*ein 21

这是Java 8方式,使用流和Joda-Time.

List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

您可以使用其__CODE__类,使用Java 8及更高版本中内置的java.time框架执行相同的操作.

  • numofDays可以找到long numofDays = ChronoUnit.DAYS.between(startDate,endDate); (2认同)

小智 13

请找到以下代码.

List<Date> dates = new ArrayList<Date>();

String str_date ="27/08/2010";
String end_date ="02/09/2010";

DateFormat formatter ; 

formatter = new SimpleDateFormat("dd/MM/yyyy");
Date  startDate = (Date)formatter.parse(str_date); 
Date  endDate = (Date)formatter.parse(end_date);
long interval = 24*1000 * 60 * 60; // 1 hour in millis
long endTime =endDate.getTime() ; // create your endtime here, possibly using Calendar or Date
long curTime = startDate.getTime();
while (curTime <= endTime) {
    dates.add(new Date(curTime));
    curTime += interval;
}
for(int i=0;i<dates.size();i++){
    Date lDate =(Date)dates.get(i);
    String ds = formatter.format(lDate);    
    System.out.println(" Date is ..." + ds);
}
Run Code Online (Sandbox Code Playgroud)

输出:

日期是... 27/08/2010
日期是... 28/08/2010
日期是... 29/08/2010
日期是... 30/08/2010
日期是... 31/08/2010
日期是...... 01/09/2010
日期是...... 02/09/2010

  • 这不会在夏令时结束时工作,因为那天有25个小时.第二天你会重复.德国的例子:日期是...... 30/10/2010 | 日期是...... 31/10/2010 | 日期是...... 31/10/2010 | 日期是... 01/11/2010(简单的解决方案:在开始日期添加几个小时(12)) (2认同)

The*_*ech 5

使用 Java 8

public Stream<LocalDate> getDaysBetween(LocalDate startDate, LocalDate endDate) {
    return IntStream.range(0, (int) DAYS.between(startDate, endDate)).mapToObj(startDate::plusDays);
}
Run Code Online (Sandbox Code Playgroud)


Men*_*ild 5

推荐日期流

Java 9中,可以使用以下新方法LocalDate::datesUntil

LocalDate start = LocalDate.of(2017, 2, 1);
LocalDate end = LocalDate.of(2017, 2, 28);

Stream<LocalDate> dates = start.datesUntil(end.plusDays(1));
List<LocalDate> list = dates.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

新方法datesUntil(...)的结束日期不限,因此所示的hack增加了一天。

一旦获得流,就可以利用java.util.stream-或java.util.function-packages 提供的所有功能。与基于自定义for或while循环的早期方法相比,使用流已变得如此简单。


或者,如果您正在寻找一种基于流的解决方案,该解决方案默认情况下在包含日期上运行,但也可以进行其他配置,那么您可能会发现我的库Time4J中的DateInterval有趣,因为它围绕日期流提供了许多特殊功能,包括高效的分隔符比Java-9中的速度更快:

PlainDate start = PlainDate.of(2017,  2, 1);
PlainDate end = start.with(PlainDate.DAY_OF_MONTH.maximized());
Stream<PlainDate> stream = DateInterval.streamDaily(start, end);
Run Code Online (Sandbox Code Playgroud)

甚至整个月的情况更简单:

Stream<PlainDate> februaryDates = CalendarMonth.of(2017, 2).streamDaily();
List<LocalDate> list = 
    februaryDates.map(PlainDate::toTemporalAccessor).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


fol*_*one 2

一种解决方案是创建一个Calendar实例,然后开始一个循环,增加其Calendar.DATE字段,直到达到所需的日期。此外,在每个步骤中,您应该创建一个Date实例(带有相应的参数),并将其放入您的列表中。

一些脏代码:

    public List<Date> getDatesBetween(final Date date1, final Date date2) {
    List<Date> dates = new ArrayList<Date>();

    Calendar calendar = new GregorianCalendar() {{
        set(Calendar.YEAR, date1.getYear());
        set(Calendar.MONTH, date1.getMonth());
        set(Calendar.DATE, date1.getDate());
    }};

    while (calendar.get(Calendar.YEAR) != date2.getYear() && calendar.get(Calendar.MONTH) != date2.getMonth() && calendar.get(Calendar.DATE) != date2.getDate()) {
        calendar.add(Calendar.DATE, 1);
        dates.add(new Date(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)));
    }

    return dates;
}
Run Code Online (Sandbox Code Playgroud)