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)
实现自己的迭代器也不会太难,这样做会更好.
Yad*_*nan 39
如果您使用的是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)
小智 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)
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框架执行相同的操作.
小智 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
使用 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)
在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)
一种解决方案是创建一个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)
归档时间: |
|
查看次数: |
111780 次 |
最近记录: |