【Java】打印两时间段所有日期方法

做Echarts图表统计时,需要用到近一周数据展示,X轴需用到两段时间日期时间显示

打印两日期时间段中的所有日期显示

1.首先使用传统Date与Calendar时间处理方式打印,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//格式化输出 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date startDate = sdf.parse("2018-6-25");
Date endDate = sdf.parse("2018-7-3");
Date tmp = startDate;
Calendar now = Calendar.getInstance();
now.setTime(startDate);
for (int i = 1; tmp.getTime() < endDate.getTime(); i++) {
tmp = now.getTime();
System.out.println("第"+i+"天:"+sdf.format(tmp));
now.add(Calendar.DAY_OF_MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}

执行输出:

第1天:2018-06-25
第2天:2018-06-26
第3天:2018-06-27
第4天:2018-06-28
第5天:2018-06-29
第6天:2018-06-30
第7天:2018-07-01
第8天:2018-07-02
第9天:2018-07-03

2.第二种利用Java8的LocalDate类处理,代码如下:

1
2
3
4
5
6
LocalDate startDate = LocalDate.of(2018, 6, 25);
LocalDate endDate = LocalDate.of(2018, 7, 3);
long between = ChronoUnit.DAYS.between(startDate, endDate);
for (long i = 0; i <= between; i++) {
System.out.println(startDate.plus(i,ChronoUnit.DAYS));
}

执行输出:

2018-06-25
2018-06-26
2018-06-27
2018-06-28
2018-06-29
2018-06-30
2018-07-01
2018-07-02
2018-07-03

3.基于以上 利用流式处理。 Stream.iterate(final T seed, final UnaryOperator f)

指定一个seed,生成从seed到常量f的流。

代码如下:

1
2
Stream.iterate(startDate, x -> x.plusDays(1)).limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
.forEach(System.out::println);

根据起始值当前日期,每次生成一个指定递增值(day+1)的天数,limit(n)用于截断流的长度,即只获取两天之差的天数值,打印输出。

2018-06-25
2018-06-26
2018-06-27
2018-06-28
2018-06-29
2018-06-30
2018-07-01
2018-07-02
2018-07-03