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

sys*_*bug 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*teo 14

乔达时间

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kov 6

你可以使用这个功能:

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();
}
Run Code Online (Sandbox Code Playgroud)

在这里找到. 失败的原因是什么?为什么你认为你的代码失败了?


Bas*_*que 5

java.time

从Java 8开始,其他答案已过时。

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

LocalDate (仅日期)

如果您只关心日期而不是时间,请使用LocalDate该类。该LocalDate级表示日期,只值,没有时间的天,没有时区。

LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
Run Code Online (Sandbox Code Playgroud)

要获取当前日期,请指定一个时区。在任何给定的时刻,今天的日期都会随时区而变化。例如,巴黎的新天要比蒙特利尔早。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Run Code Online (Sandbox Code Playgroud)

我们可以使用isEqualisBeforeisAfter方法比较。在日期时间工作中,我们通常使用Half-Open方法,其中时间跨度的开始是包含在内的,而结束时间是排除的

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

Instant (约会时间)

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

Instant startInstant = juDate_Start.toInstant();
Instant stopInstant = juDate_Stop.toInstant();
Run Code Online (Sandbox Code Playgroud)

从这些Instant对象中,LocalDate通过以下方法获取对象:

  • 应用对您的上下文有意义的时区来获取ZonedDateTime对象。该对象与时间轴上的时刻相同,Instant但分配了特定的时区。
  • 将转换ZonedDateTimeLocalDate

我们必须应用时区,因为日期仅在时区的上下文中具有含义。如上所述,在任何给定的时刻,日期在世界各地都不同。

示例代码。

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