项目需求中有统计分析的需求,需要按照年,季度,月进行筛选统计数据。
java 8提供LocalDate类,方便操作时间。
根据需求,返回年,季,月
/**
* 根据时间类型返回起始时间节点
* 年 返回近三年
* 季 返回往前推两年季度
* 月 返回本年十二个月
* @param dateType
* @return
*/
public static List<DateDto> dateResultByType(Integer dateType) {
List<DateDto> dateDtos = new ArrayList<>();
switch (dateType){
//年
case 1:
dateDtos = yearDate();
break;
//季度
case 2:
dateDtos = quarterDate();
break;
//月
case 3:
dateDtos = monthDate();
break;
//默认年
default:
dateDtos = yearDate();
break;
}
return dateDtos;
}
/**
* 月(默认取12个月)
* @return
*/
private static List<DateDto> monthDate() {
List<DateDto> dateDtos = new ArrayList<>();
var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
var now = LocalDate.now();
for (int i=1; i<=12;i++){
//本月第一天
var start = now.withDayOfMonth(1);
//本月最后一天
var end = now.with(TemporalAdjusters.lastDayOfMonth());
DateDto dateDto = new DateDto();
dateDto.setStartTime(start.format(formatter))
.setEndTime(end.format(formatter));
dateDtos.add(dateDto);
//动态修改月份(往前推一个月)
now = LocalDate.now().minusMonths(i);
}
return dateDtos;
}
/**
* 季度
* @return
*/
private static List<DateDto> quarterDate() {
List<DateDto> dateDtos = new ArrayList<>();
var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
var now = LocalDate.now();
for (int i = 1;i <= 6;i++){
var month = ((now.getMonthValue() - 1)) / 3 * 3 + 1;
var start = now.withMonth(month).withDayOfMonth(1);
var end = now.with(TemporalAdjusters.lastDayOfMonth());
DateDto dateDto = new DateDto();
dateDto.setStartTime(start.format(formatter))
.setEndTime(end.format(formatter));
dateDtos.add(dateDto);
now = LocalDate.now().minusMonths(3*i);
}
return dateDtos;
}
/**
* 年
* @return
*/
private static List<DateDto> yearDate() {
List<DateDto> dateDtos = new ArrayList<>();
var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
var now = LocalDate.now();
for (int i=1;i<=3;i++){
var start = now.with(TemporalAdjusters.firstDayOfYear());
var end = now.with(TemporalAdjusters.lastDayOfYear());
DateDto dateDto = new DateDto();
dateDto.setStartTime(start.format(formatter))
.setEndTime(end.format(formatter));
dateDtos.add(dateDto);
now = LocalDate.now().minusYears(i);
}
return dateDtos;
}
/**
* 格式化日期
* @param time
* @param type
* @return
*/
public static String formatDate(String time,Integer type){
var date = "";
switch (type){
case 1:
date = LocalDate.parse(time).format(DateTimeFormatter.ofPattern("yyyy年"));
break;
case 2:
int year = LocalDate.parse(time).getYear();
int month = LocalDate.parse(time).getMonth().getValue();
if(month>=1 && month<=3){
date = year + "年第一季度";
}else if(month>=4 && month<=6){
date = year + "年第二季度";
}else if(month>=7 && month<=9){
date = year + "年第三季度";
}else if(month>=10 && month<=12){
date = year + "年第四季度";
}
break;
case 3:
date = LocalDate.parse(time).format(DateTimeFormatter.ofPattern("yyyy年MM月"));
break;
default:
date = LocalDate.parse(time).format(DateTimeFormatter.ofPattern("yyyy年"));
break;
}
return date;
}