Java 连续日期周期作为sql查询条件

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

public class TestDate {
	private static final String dateStyle = "yyyy-MM-dd";
	private static final SimpleDateFormat formater = new SimpleDateFormat(dateStyle);

	private static final String K_BEG = "begDate";
	private static final String K_END = "endDate";

	/**
	 * 通过字符串解析出时间
	 * @param dateStr
	 * @return
	 */
	private Date getDateByString(String dateStr) {
		Date date = null;
		try {
			date = formater.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 获得测试数据
	 * @return
	 */
	private List<Map<String, Date>> getDateList() {
		List<Map<String, Date>> list = new ArrayList<Map<String, Date>>();
		String b1 = "2011-01-01";
		String e1 = "2012-01-01";

		String b2 = "2013-01-01";
		String e2 = "2014-01-01";

		String b3 = "2014-01-02";
		String e3 = "2015-01-02";

		String b4 = "2015-01-03";
		String e4 = "2016-01-03";

		String b5 = "2017-01-01";
		String e5 = "2018-01-01";

		list.add(getDateMap(b3, e3));
		list.add(getDateMap(b2, e2));
		list.add(getDateMap(b1, e1));
		//list.add(getDateMap(b5, e5));
		list.add(getDateMap(b4, e4));

		return list;
	}
	
	/**
	 *  日期 +n 天
	 * @param date
	 * @param day
	 * @return
	 */
	private Date addDay(Date date, int day) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + day);
		return calendar.getTime();
	}

	
	/**
	 *  获得包含开始日期和结束日期的Map
	 * @param b1 开始日期
	 * @param e1 结束日期
	 * @return
	 */
	private Map<String, Date> getDateMap(String b1, String e1) {
		Map<String, Date> dateMap = new HashMap<String, Date>();
		dateMap.put(K_BEG, getDateByString(b1));
		dateMap.put(K_END, getDateByString(e1));
		return dateMap;
	}

	/**
	 * /**
	 *  获得包含开始日期和结束日期的Map
	 * @param b1 开始日期
	 * @param e1 结束日期
	 * @return
	 */
	private Map<String, Date> getDateMap(Date b1, Date e1) {
		Map<String, Date> dateMap = new HashMap<String, Date>();
		dateMap.put(K_BEG, b1);
		dateMap.put(K_END, e1);
		return dateMap;
	}

	
	@Test
	public void testDatePeriod() {
		
		//获得测试数据
		List<Map<String, Date>> dateList = getDateList();

		
		//记录中的Map按开始时间升序排列
		Collections.sort(dateList, new Comparator<Map<String, Date>>() {
			@Override
			public int compare(Map<String, Date> o1, Map<String, Date> o2) {
				Date b1 = o1.get(K_BEG);
				Date b2 = o2.get(K_BEG);
				return b1.compareTo(b2);
			}
		});
		
		//返回的结果,连接好的日期周期
		List<Map<String, Date>> resultList = new ArrayList<Map<String, Date>>();
		Date tempBeg = null;
		Date tempEnd = null;
		
		for (Map<String, Date> map : dateList) {
			Date begDate = map.get(K_BEG);
			Date endDate = map.get(K_END);
			
			if (tempBeg == null && tempEnd == null) { //第一次执行
				tempBeg = begDate;
				tempEnd = endDate;
			} else {
				//若上一个日期周期的结束日期等于或者比当前这个日期周期的小一天,则认为是连续的周期
				if (tempEnd.equals(begDate) || tempEnd.equals(addDay(begDate, -1))) {
					tempEnd = endDate;
				} else { //如果与上一个周期不是连续的周期,则将上一个周期的结果添加到列表,设置当前周期,一遍进行下次判断
					resultList.add(getDateMap(tempBeg, tempEnd));
					tempBeg = begDate;
					tempEnd = endDate;
				}
			}
		}
		
		//最后一次设置的周期
		if (tempBeg != null && tempEnd != null) {
			resultList.add(getDateMap(tempBeg, tempEnd));
		}

		System.out.println(resultList);
	}
}

猜你喜欢

转载自mataszhang.iteye.com/blog/2217448