Java生成x和y之间的所有日期

时间:2011-11-17 11:32:53

标签: java date-range

我尝试生成日期x和日期y之间的日期范围,但失败了。我在c#中使用相同的方法,所以我尝试尽可能多地修改它但是没有得到结果。知道我能解决什么吗?

private ArrayList<Date> GetDateRange(Date start, Date end) {
    if(start.before(end)) {
        return null;
    }

    int MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
    ArrayList<Date> listTemp = new ArrayList<Date>();
    Date tmpDate = start;

    do {
        listTemp.add(tmpDate);
        tmpDate = tmpDate.getTime() + MILLIS_IN_DAY;
    } while (tmpDate.before(end) || tmpDate.equals(end));

    return listTemp;
}

说实话,我试图将所有日期从1月1日开始直到2012年12月31日结束。如果有更好的方法,请告诉我。 感谢

5 个答案:

答案 0 :(得分:12)

约达时间

java中的日历和日期API非常奇怪...我强烈建议考虑jodatime,它是处理日期的事实上的库。 它非常强大,正如您可以从快速入门中看到的那样:http://joda-time.sourceforge.net/quickstart.html

此代码使用Joda-Time

解决了这个问题
import java.util.ArrayList;
import java.util.List;

import org.joda.time.DateTime;


public class DateQuestion {

    public static List<DateTime> getDateRange(DateTime start, DateTime end) {

        List<DateTime> ret = new ArrayList<DateTime>();
        DateTime tmp = start;
        while(tmp.isBefore(end) || tmp.equals(end)) {
            ret.add(tmp);
            tmp = tmp.plusDays(1);
        }
        return ret;
    }

    public static void main(String[] args) {

        DateTime start = DateTime.parse("2012-1-1");
        System.out.println("Start: " + start);

        DateTime end = DateTime.parse("2012-12-31");
        System.out.println("End: " + end);

        List<DateTime> between = getDateRange(start, end);
        for (DateTime d : between) {
            System.out.println(" " + d);
        }
    }
}

答案 1 :(得分:5)

您可以使用此功能:

public static Date addDay(Date date){
   //TODO you may want to check for a null date and handle it.
   Calendar cal = Calendar.getInstance();
   cal.setTime (date);
   cal.add (Calendar.DATE, 1);
   return cal.getTime();
}

Found here. 失败的原因是什么?为什么你认为你的代码失败了?

答案 2 :(得分:3)

java.time

其他答案在Java 8中已经过时了。

与早期版本的Java捆绑在一起的旧日期时间类已经被Java 8及更高版本中内置的java.time框架所取代。请参阅Tutorial

LocalDate(仅限日期)

如果您只关心没有时间的日期,请使用LocalDate课程。 LocalDate类表示仅限日期的值,没有时间和没有时区。

LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;

要获取当前日期,请指定时区。在任何特定时刻,今天的日期因时区而异。例如,巴黎的新日早些时候比蒙特利尔早了。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

我们可以使用isEqualisBeforeisAfter方法进行比较。在日期时间工作中,我们通常使用半开放方法,其中一段时间​​的开始是包含,而结尾是独占

List<LocalDate> localDates = new ArrayList<>();
LocalDate localDate = start;
while ( localDate.isBefore( stop ) ) {
    localDates.add( localDate );
    // Set up the next loop.
    localDate = localDate.plusDays( 1 );
}

Instant(日期时间)

如果您有旧的java.util.Date对象(表示日期和时间),请转换为Instant类。 Instant是UTC时间轴上的一个时刻。

Instant startInstant = juDate_Start.toInstant();
Instant stopInstant = juDate_Stop.toInstant();

从这些Instant个对象中,获取LocalDate个对象:

  • 应用对您的上下文有意义的时区来获取ZonedDateTime对象。此对象与Instant在时间轴上的时刻完全相同,但指定了特定的时区。
  • ZonedDateTime转换为LocalDate

我们必须应用时区作为日期仅在时区的上下文中具有意义。正如我们上面所说,在任何特定时刻,日期都会因世界而异。

示例代码。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate start = ZonedDateTime.ofInstant( startInstant , zoneId ).toLocalDate();
LocalDate stop = ZonedDateTime.ofInstant( stopInstant , zoneId ).toLocalDate();

答案 3 :(得分:2)

您可以使用joda-time

Days.daysBetween(fromDate, toDate);

在joda-time主页上找到。

similar question in stackoverflow有一些好的答案。

答案 4 :(得分:1)

查看Calendar API,尤其是Calendar.add()。