1. 程式人生 > >Java獲取各種第一天

Java獲取各種第一天

前段時間自己學習的時候發現,很多時候我們需要獲取某一個日期所在周、月、年的第一天或者最後一天。為了方便以後自己用,就決定整理一下,寫一個工具類。在網上查了好多文章,最後自己總結了一下寫出下面的工具類:

package cn.eboy.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 
 * @ClassName: DateUtil 
 * @Description: 日期計算有關的工具類TODO 
 * @author ExceptionalBoy 
 * @date 2017年11月14日 上午10:50:04 
 *
 */
public class DateUtil {
	
	/**
	 * 前一週的第一天
	 */
	public final static int FIRST_DAY_OF_PRE_WEEK = 0;
	
	/**
	 * 前一週的最後一天
	 */
	public final static int LAST_DAY_OF_PRE_WEEK = 1;
	
	/**
	 * 本週的第一天
	 */
	public final static int FIRST_DAY_OF_CUR_WEEK = 2;
	
	/**
	 * 本週的最後一天
	 */
	public final static int LAST_DAY_OF_CUR_WEEK = 3;
	
	/**
	 * 前一月的第一天
	 */
	public final static int FIRST_DAY_OF_PRE_MONTH = 4;
	
	/**
	 * 前一月的最後一天
	 */
	public final static int LAST_DAY_OF_PRE_MONTH = 5;
	
	/**
	 * 本月的第一天
	 */
	public final static int FIRST_DAY_OF_CUR_MONTH = 6;
	
	/**
	 * 本月的最後一天
	 */
	public final static int LAST_DAY_OF_CUR_MONTH = 7;
	
	/**
	 * 前一年的第一天
	 */
	public final static int FIRST_DAY_OF_PRE_YEAR = 8;
	
	/**
	 * 前一年的最後一天
	 */
	public final static int LAST_DAY_OF_PRE_YEAR = 9;
	
	/**
	 * 本年的第一天
	 */
	public final static int FIRST_DAY_OF_CUR_YEAR = 10;
	
	/**
	 * 本年的最後一天
	 */
	public final static int LAST_DAY_OF_CUR_YEAR = 11;
	
	//第一天
	private static String firstDay;
	//最後一天
	private static String lastDay;
	//日期格式化物件
	private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	

	/**
	 * 
	 * @Title: getDateByConditions 
	 * @Description: 根據引數日期及要獲取的日期條件,獲取相應的日期TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @param contition 
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:59:44
	 */
	public static String getDateByConditions(Date date,int contition){
		String day = null;
		switch (contition) {
		case 0:
			day = firstDayOfPreWeek(date);
			break;
		case 1:
			day = lastDayOfPreWeek(date);
			break;
		case 2:
			day = firstDayOfCurWeek(date);
			break;
		case 3:
			day = lastDayOfCurWeek(date);
			break;
		case 4:
			day = firstDayOfPreMonth(date);
			break;
		case 5:
			day = lastDayOfPreMonth(date);
			break;
		case 6:
			day = firstDayOfCurMonth(date);
			break;
		case 7:
			day = lastDayOfCurMonth(date);
			break;
		case 8:
			day = firstDayOfPreYear(date);
			break;
		case 9:
			day = lastDayOfPreYear(date);
			break;
		case 10:
			day = firstDayOfCurYear(date);
			break;
		case 11:
			day = lastDayOfCurYear(date);
			break;
		default:
			break;
		}
		return day;
	}

	/**
	 * 
	 * @Title: firstDayOfPreWeek 
	 * @Description: 獲取引數日期前一週的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:54:41
	 */
	private static String firstDayOfPreWeek(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE,-7);
		// 判斷要計算的日期是否是週日,如果是則減一天計算週六的,否則會出問題,計算到下一週去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY);// 設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根據日曆的規則,給當前日期減去星期幾與一個星期第一天的差值
		firstDay = dateFormat.format(cal.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfPreWeek 
	 * @Description: 獲取引數日期前一週的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:55:04
	 */
	private static String lastDayOfPreWeek(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE,-7);
		// 判斷要計算的日期是否是週日,如果是則減一天計算週六的,否則會出問題,計算到下一週去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY);// 設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根據日曆的規則,給當前日期減去星期幾與一個星期第一天的差值
		cal.add(Calendar.DATE, 6);
		lastDay = dateFormat.format(cal.getTime());
		return lastDay;
	}

	/**
	 * 
	 * @Title: firstDayOfCurWeek 
	 * @Description: 獲取引數日期所在周的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:55:27
	 */
	private static String firstDayOfCurWeek(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		// 判斷要計算的日期是否是週日,如果是則減一天計算週六的,否則會出問題,計算到下一週去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY);// 設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根據日曆的規則,給當前日期減去星期幾與一個星期第一天的差值
		firstDay = dateFormat.format(cal.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfCurWeek 
	 * @Description: 獲取引數日期所在周的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:55:50
	 */
	private static String lastDayOfCurWeek(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		// 判斷要計算的日期是否是週日,如果是則減一天計算週六的,否則會出問題,計算到下一週去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY);// 設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK);// 獲得當前日期是一個星期的第幾天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根據日曆的規則,給當前日期減去星期幾與一個星期第一天的差值
		cal.add(Calendar.DATE, 6);
		lastDay = dateFormat.format(cal.getTime());
		return lastDay;
	}

	/**
	 * 
	 * @Title: firstDayOfPreMonth 
	 * @Description: 獲取引數日期前一月的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:56:15
	 */
	private static String firstDayOfPreMonth(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, -1);
		Date theDate = calendar.getTime();
		// 上個月第一天
		GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance();
		gcLast.setTime(theDate);
		gcLast.set(Calendar.DAY_OF_MONTH, 1);
		firstDay = dateFormat.format(gcLast.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfPreMonth 
	 * @Description: 獲取引數日期前一月的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:56:36
	 */
	private static String lastDayOfPreMonth(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, -1);
		calendar.add(Calendar.MONTH, 1); // 加一個月
		calendar.set(Calendar.DATE, 1); // 設定為該月第一天
		calendar.add(Calendar.DATE, -1); // 再減一天即為上個月最後一天
		lastDay = dateFormat.format(calendar.getTime());
		return lastDay;
	}

	/**
	 * 
	 * @Title: firstDayOfCurMonth 
	 * @Description: 獲取引數日期所在月的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:57:02
	 */
	private static String firstDayOfCurMonth(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		Date theDate = calendar.getTime();
		// 上個月第一天
		GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance();
		gcLast.setTime(theDate);
		gcLast.set(Calendar.DAY_OF_MONTH, 1);
		firstDay = dateFormat.format(gcLast.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfCurMonth 
	 * @Description: 獲取引數日期所在月的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:57:29
	 */
	private static String lastDayOfCurMonth(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1); // 加一個月
		calendar.set(Calendar.DATE, 1); // 設定為該月第一天
		calendar.add(Calendar.DATE, -1); // 再減一天即為上個月最後一天
		lastDay = dateFormat.format(calendar.getTime());
		return lastDay;
	}

	/**
	 * 
	 * @Title: firstDayOfPreYear 
	 * @Description: 獲取引數日期前一年的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:58:02
	 */
	private static String firstDayOfPreYear(Date date){
		Calendar calendar = Calendar.getInstance();
		int year = date.getYear() + 1900;
		calendar.clear();
		calendar.set(Calendar.YEAR, year-1);
		firstDay = dateFormat.format(calendar.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfPreYear 
	 * @Description: 獲取引數日期前一年的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:58:25
	 */
	private static String lastDayOfPreYear(Date date){
		Calendar calendar = Calendar.getInstance();
		int year = date.getYear() + 1900;
		calendar.clear();
		calendar.set(Calendar.YEAR, year);
		calendar.add(calendar.DATE, -1);
		lastDay = dateFormat.format(calendar.getTime());
		return lastDay;
	}

	/**
	 * 
	 * @Title: firstDayOfCurYear 
	 * @Description: 獲取引數日期所在年的第一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:58:52
	 */
	private static String firstDayOfCurYear(Date date){
		Calendar calendar = Calendar.getInstance();
		int year = date.getYear() + 1900;
		calendar.clear();
		calendar.set(Calendar.YEAR, year);
		firstDay = dateFormat.format(calendar.getTime());
		return firstDay;
	}

	/**
	 * 
	 * @Title: lastDayOfCurYear 
	 * @Description: 獲取引數日期所在年的最後一天TODO
	 * @author ExceptionalBoy 
	 * @param @param date
	 * @param @return 
	 * @return String   
	 * @throws
	 * @date 2017年11月14日 上午10:59:16
	 */
	private static String lastDayOfCurYear(Date date){
		Calendar calendar = Calendar.getInstance();
		int year = date.getYear() + 1900;
		calendar.clear();
		calendar.set(Calendar.YEAR, year+1);
		calendar.add(calendar.DATE, -1);
		lastDay = dateFormat.format(calendar.getTime());
		return lastDay;
	}
}