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

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

private ArrayList GetDateRange(Date start, Date end) { if(start.before(end)) { return null; } int MILLIS_IN_DAY = 1000 * 60 * 60 * 24; ArrayList listTemp = new ArrayList(); 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日结束。 如果有更好的方法,请告诉我。 谢谢

乔达时间

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 getDateRange(DateTime start, DateTime end) { List ret = new ArrayList(); 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 between = getDateRange(start, end); for (DateTime d : between) { System.out.println(" " + d); } } } 

你可以使用这个function:

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

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

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

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

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

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

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

你可以使用joda-time 。

 Days.daysBetween(fromDate, toDate); 

在joda-time主页上找到。

stackoverflow中的类似问题,有一些很好的答案。

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