在开发中,有这么个需求,根据项目上线时间,按季度统计费用,由于项目上线时间变化太大,后来直接配置在配置文件中,待点击统计菜单,打开统计页面时,向后台请求季度数据;读取配置文件,获得上线时间,调用工具类获得季度数据,返回用来填充easyui的combobox。
代码注释比较详细,直接贴代码,作以记录。
Java端工具类
/**
* 动态获取季度
* @author iCheetor
*
*/
public class CreateDynamicQuarter {
public static void main(String[] args) throws ParseException {
List<Map<String, Object>> show = show("2017-08-20");
System.out.println(show);
List<Map<String, Object>> showFuture = showPastAndFuture("2017-10-30");
System.out.println(showFuture);
}
/**
* 比较当前日期和参数给定日期,小于当前日期返回true
* @param date
* @return
* @throws ParseException
*/
public static boolean validate(String date) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date parse = sdf.parse(date);
Date current = new Date();
if (parse.getTime() < current.getTime()){
return true;
}
return false;
}
/**
* 从给定日期到当前日期之间的季度,给定小
* @param date
* @return
* @throws ParseException
*/
public static List<Map<String,Object>> show(String date) throws ParseException{
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
String[] split = date.split("-");
int y = Integer.parseInt(split[0]);//年
int m = Integer.parseInt(split[1]);//月
int quarterStart = getQuarter(m); //对应季度
for(;;){
if(check(y,quarterStart)){//比当前大,直接break
for(int i = 0; i < 4; i ++){
if(i != 0){ //第一次,使用初始计算季度,以后加1
quarterStart = quarterStart + 1;
}
if(quarterStart > 4){//第四季度+1大于4,跳出内循环
break;
} else {
if(check(y,quarterStart)){
Map<String,Object> map = new HashMap<String, Object>();
String key = UUID.randomUUID().toString();
String value = getValue(y,quarterStart);
map.put("id", key );
map.put("name", value);
list.add(map);
}
}
}
y = y + 1; //内循环结束,年份加1,月份置为1,季度置为1
m = 1;
quarterStart = 1;
} else {
break;
}
}
/**
* 集合反转,保证倒序,加入最后一个元素,“自定义”
*/
Collections.reverse(list);
list.add(addLast0());
/**
* 可以不用处理,如果第一个元素上的操作比较特殊,再进行处理
*/
processFirst(list);
return list;
}
/**
* 处理第一个元素
* @param list 待