java 时间处理


import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 时间处理类
 * 
 * @author Administrator
 *
 */
@SuppressWarnings(value={"rawtypes","unused"})
public class DataOperation {
	/**
	 * 查询一个时间段的总周数和查询当前时间是第几周
	 * 
	 * @param start
	 * @param end
	 * @return
	 */
	public static void main(String[] args) {

		System.out.println(DataOperation.getStartEndWeek("2018-4-11", "2018-4-23"));
		/*
		 * System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2015, 47));
		 * System.out.println("结束时间:" + cd.getEndDayOfWeekNo(2015, 47));
		 * getDates("2013-04-01", "2014-04-14","星期一|星期二|星期日"); //获取某一时间段特定星期几的日期
		 */
	}
	/**
	 * sjw
	 * China
	 * @param start 开始时间 ‘- ’隔开 例如(2018-4-11)不支持时分秒
	 * @param end 结束时间‘- ’隔开 例如(2018-4-11)不支持时分秒
	 * @return Map 其中2个Key(WeekStart每周的第一天的List,WeekEnd每周的最后一天的List,WeekCount时间段周数)
	 */
	public static Map getStartEndWeek(String start, String end) {
		
		String[] starts = start.split("-");
		String[] ends = end.split("-");
		int startyear = Integer.parseInt(starts[0]);
		int startmoune = Integer.parseInt(starts[1]);
		int startday = Integer.parseInt(starts[2]);
		int endyear = Integer.parseInt(ends[0]);
		int endmoune = Integer.parseInt(ends[1]);
		int endday = Integer.parseInt(ends[2]);
		Calendar c_begin = new GregorianCalendar();
		Calendar c_end = new GregorianCalendar();
		DateFormatSymbols dfs = new DateFormatSymbols();
		String[] weeks = dfs.getWeekdays();

		c_begin.set(startyear, startmoune - 1, startday); // Calendar的月从0-11,所以4月是3.
		c_end.set(endyear, endmoune - 1, endday); // Calendar的月从0-11,所以5月是4.

		int count = 1;
		c_end.add(Calendar.DAY_OF_YEAR, 1); // 结束日期下滚一天是为了包含最后一天
		Map<String, Object> map = new HashMap<String, Object>();
		List<String> listend = new ArrayList<String>();
		List<String> liststart = new ArrayList<String>();
		while (c_begin.before(c_end)) {
			/*System.out.println("第" + count + "周  日期:"
					+ new java.sql.Date(c_begin.getTime().getTime()) + ","
					+ weeks[c_begin.get(Calendar.DAY_OF_WEEK)]);*/

			if (c_begin.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
				/*System.out.println("第第" + count + "周  日期:"
						+ new java.sql.Date(c_begin.getTime().getTime()) + ","
						+ weeks[c_begin.get(Calendar.DAY_OF_WEEK)]);//每周的最后一天
*/				listend.add(new java.sql.Date(c_begin.getTime().getTime()).toString());
				count++;
			}
			if (c_begin.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
				liststart.add(new java.sql.Date(c_begin.getTime().getTime()).toString());
			}
			c_begin.add(Calendar.DAY_OF_YEAR, 1);
		}
		map.put("WeekStart", liststart);
		map.put("WeekEnd", listend);
		map.put("WeekCount", count);
		return map;
	}

	/**
	 * get first date of given month and year
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	public String getFirstDayOfMonth(int year, int month) {
		String monthStr = month < 10 ? "0" + month : String.valueOf(month);
		return year + "-" + monthStr + "-" + "01";
	}

	/**
	 * get the last date of given month and year
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	public String getLastDayOfMonth(int year, int month) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, year);
		calendar.set(Calendar.MONTH, month - 1);
		calendar.set(Calendar.DATE, 1);
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return calendar.get(Calendar.YEAR) + "-"
				+ (calendar.get(Calendar.MONTH) + 1) + "-"
				+ calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * get Calendar of given year
	 * 
	 * @param year
	 * @return
	 */
	private Calendar getCalendarFormYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		cal.set(Calendar.YEAR, year);
		return cal;
	}

	/**
	 * get start date of given week no of a year
	 * 
	 * @param year
	 * @param weekNo
	 * @return
	 */
	public String getStartDayOfWeekNo(int year, int weekNo) {
		Calendar cal = getCalendarFormYear(year);
		cal.set(Calendar.WEEK_OF_YEAR, weekNo);
		return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1)
				+ "-" + cal.get(Calendar.DAY_OF_MONTH);

	}

	/**
	 * get the end day of given week no of a year.
	 * 
	 * @param year
	 * @param weekNo
	 * @return
	 */
	public String getEndDayOfWeekNo(int year, int weekNo) {
		Calendar cal = getCalendarFormYear(year);
		cal.set(Calendar.WEEK_OF_YEAR, weekNo);
		cal.add(Calendar.DAY_OF_WEEK, 6);
		return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1)
				+ "-" + cal.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 判断当前日期是星期几
	 *
	 * @param pTime
	 *            修要判断的时间
	 * @return dayForWeek 判断结果
	 * @Exception 发生异常
	 */
	public int dayForWeek(String pTime) throws Exception {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(format.parse(pTime));
		int dayForWeek = 0;
		if (c.get(java.util.Calendar.DAY_OF_WEEK) == 1) {
			dayForWeek = 7;
		} else {
			dayForWeek = c.get(java.util.Calendar.DAY_OF_WEEK) - 1;
		}
		return dayForWeek;
	}

	/**
	 * 查询一周的开始时间和结束时间
	 * 
	 * @param date
	 * @return
	 */
	private Map<String, Date> onceWeek(Date date) {
		java.util.Calendar currentDate = new GregorianCalendar();
		currentDate.setTime(date);
		currentDate.setFirstDayOfWeek(java.util.Calendar.MONDAY);
		currentDate.set(java.util.Calendar.HOUR_OF_DAY, 0);
		currentDate.set(java.util.Calendar.MINUTE, 0);
		currentDate.set(java.util.Calendar.SECOND, 0);
		currentDate.set(java.util.Calendar.DAY_OF_WEEK,
				java.util.Calendar.MONDAY);
		Date dBegin = (Date) currentDate.getTime().clone();

		currentDate.setFirstDayOfWeek(java.util.Calendar.MONDAY);
		currentDate.set(java.util.Calendar.HOUR_OF_DAY, 23);
		currentDate.set(java.util.Calendar.MINUTE, 59);
		currentDate.set(java.util.Calendar.SECOND, 59);
		currentDate.set(java.util.Calendar.DAY_OF_WEEK,
				java.util.Calendar.SUNDAY);

		Date dEnd = (Date) currentDate.getTime().clone();

		// 返回星期天和一个星期的日期和周几
		Map<String, Date> map = new HashMap<>();
		map.put("dBegin", dBegin);
		map.put("dEnd", dEnd);
		return map;
	}

	/**
	 * 获取某一时间段特定星期几的日期
	 * 
	 * @param dateFrom
	 *            开始时间
	 * @param dateEnd
	 *            结束时间
	 * @param weekDays
	 *            星期
	 * @return 返回时间数组
	 */
	public static String[] getDates(String dateFrom, String dateEnd,
			String weekDays) {
		long time = 1l;
		long perDayMilSec = 24 * 60 * 60 * 1000;
		List<String> dateList = new ArrayList<String>();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		// 需要查询的星期系数
		String strWeekNumber = weekForNum(weekDays);
		try {
			dateFrom = sdf.format(sdf.parse(dateFrom).getTime() - perDayMilSec);

			while (true) {
				time = sdf.parse(dateFrom).getTime();
				time = time + perDayMilSec;
				Date date = new Date(time);
				dateFrom = sdf.format(date);
				if (dateFrom.compareTo(dateEnd) <= 0) {
					// 查询的某一时间的星期系数
					Integer weekDay = dayForWeek(date);
					// 判断当期日期的星期系数是否是需要查询的
					if (strWeekNumber.indexOf(weekDay.toString()) != -1) {
						//System.out.println(dateFrom);
						dateList.add(dateFrom);
					}
				} else {
					break;
				}
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String[] dateArray = new String[dateList.size()];
		dateList.toArray(dateArray);
		return dateArray;
	}

	// 等到当期时间的周系数。星期日:1,星期一:2,星期二:3,星期三:4,星期四:5,星期五:6,星期六:7
	public static Integer dayForWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 得到对应星期的系数 星期日:1,星期一:2,星期二:3,星期三:4,星期四:5,星期五:6,星期六:7
	 * 
	 * @param weekDays
	 *            星期格式 星期一|星期二
	 */
	public static String weekForNum(String weekDays) {
		// 返回结果为组合的星期系数
		String weekNumber = "";
		// 解析传入的星期
		if (weekDays.indexOf("|") != -1) {// 多个星期数
			String[] strWeeks = weekDays.split("\|");
			for (int i = 0; i < strWeeks.length; i++) {
				weekNumber = weekNumber + ""
						+ getWeekNum(strWeeks[i]).toString();
			}
		} else {// 一个星期数
			weekNumber = getWeekNum(weekDays).toString();
		}

		return weekNumber;

	}

	// 将星期转换为对应的系数 星期日:1,星期一:2,星期二:3,星期三:4,星期四:5,星期五:6,星期六:7
	public static Integer getWeekNum(String strWeek) {
		Integer number = 1;// 默认为星期日
		if ("星期日".equals(strWeek)) {
			number = 1;
		} else if ("星期一".equals(strWeek)) {
			number = 2;
		} else if ("星期二".equals(strWeek)) {
			number = 3;
		} else if ("星期三".equals(strWeek)) {
			number = 4;
		} else if ("星期四".equals(strWeek)) {
			number = 5;
		} else if ("星期五".equals(strWeek)) {
			number = 6;
		} else if ("星期六".equals(strWeek)) {
			number = 7;
		} else {
			number = 1;
		}
		return number;
	}
}

原文地址:https://www.cnblogs.com/yu-du-chen/p/12109030.html