我尝试生成日期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日结束。如果有更好的方法,请告诉我。 感谢
答案 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 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" ) );
我们可以使用isEqual
,isBefore
和isAfter
方法进行比较。在日期时间工作中,我们通常使用半开放方法,其中一段时间的开始是包含,而结尾是独占。
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)
答案 4 :(得分:1)
查看Calendar API,尤其是Calendar.add()。