我有两个日期:
Start Date: 2017-01-15
End Date: 2017-05-27
Run Code Online (Sandbox Code Playgroud)
现在我想找到这两个日期之间的整月。所以结果应该是:
Feb-2017
Mar-2017
Apr-2017
Run Code Online (Sandbox Code Playgroud)
一月不包括在结果中,因为开始日期从月中开始,五月不包括在结果中,因为结束日期不包括整个五月。
我怎样才能用 Java 实现这一点?
我试过做这样的事情:
String date1 = "2015-01-15";
String date2 = "2015-05-27";
DateFormat formater1 = new SimpleDateFormat("MMM-yyyy");
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
try {
startCalendar.setTime(formater.parse(date1));
endCalendar.setTime(formater.parse(date2));
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("startDate:" + startCalendar.getTime());
System.out.println("endCalendar:" + endCalendar.getTime());
while (startCalendar.before(endCalendar)) {
// add one month to date per loop
String date = formater1.format(startCalendar.getTime()).toUpperCase();
System.out.println(date);
startCalendar.add(Calendar.MONTH, 1);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从结果中排除 Jan 和 May。目前,我得到了这个结果:
JAN-2015
FEB-2015
MAR-2015
APR-2015
MAY-2015
Run Code Online (Sandbox Code Playgroud)
随着 Java 8 的发布,Oracle 大幅改进了他们的日期时间库,使日历逻辑的实现变得更加简单。查看java.time文档以获取更多详细信息。受支持的函数包括withDayOfMonth和lastDayOfMonth,它们允许您查找给定月份内的特定日期。
看看这个实现,使用 java.time API 进行格式化和日期操作:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM-yyyy");
LocalDate start = LocalDate.of(2017, 1, 15);
LocalDate end = LocalDate.of(2017, 5, 27);
List<String> months = new ArrayList<>();
LocalDate date = start;
if (date.getDayOfMonth() == 1) {
date = date.minusDays(1);
}
while (date.isBefore(end)) {
if (date.plusMonths(1).with(lastDayOfMonth()).isAfter(end)) {
break;
}
date = date.plusMonths(1).withDayOfMonth(1);
months.add(date.format(formatter).toUpperCase());
}
System.out.println(months);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
> [FEB-2017, MAR-2017, APR-2017]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3565 次 |
| 最近记录: |