package cn.timer.api.utils;

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

/**
 * 
* @ClassName: DateFormatUtils 
* @Description: TODO(日期格式化处理工具类) 
* @author TZQ chess222_com 
* @date 2019年3月2日 下午12:29:29 
*
 */
public class DateFormatUtils {

	public static final String YYYYMMDD = "yyyy-MM-dd";
	
	
	/**
	 * 
	* @Title: getWeekNowDay 
	* @Description: TODO(获取当天是当周的星期几) 
	* @param 
	* @return
	* @throws ParseException
	 */
	public static String getWeekNowDay() throws ParseException {
		int day ;
		String dayS = null;
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		day = cal.get(Calendar.DAY_OF_WEEK)-1 != 0?(cal.get(Calendar.DAY_OF_WEEK)-1):7;
		System.out.println("星期:"+day);
		
		switch (day) {
		case 1:
			dayS = "一";
			break;
		case 2:
			dayS = "二";
			break;
		case 3:
			dayS = "三";
			break;
		case 4:
			dayS = "四";
			break;
		case 5:
			dayS = "五";
			break;
		case 6:
			dayS = "六";
			break;
		case 7:
			dayS = "日";
			break;
		default:
			break;
		}
		
		return "星期"+ dayS;
	}
	
	
	public static Date[] getWeekFirstDay(Date date) throws ParseException {
		Date[] dates = new Date[2];
		int day ;
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		 
		day = cal.get(Calendar.DAY_OF_WEEK)-1 != 0?(cal.get(Calendar.DAY_OF_WEEK)-1):7;
		System.out.println("星期:"+day);
		
		Date date1 = new Date(cal.getTimeInMillis());
		System.out.println("今天:"+date1);
		
		cal.add(Calendar.DAY_OF_MONTH,1-day);
		cal.set(Calendar.HOUR_OF_DAY, 0);  
		cal.set(Calendar.MINUTE, 0);  
		cal.set(Calendar.SECOND, 0); 
		Date date2 = new Date(cal.getTimeInMillis());
		System.out.println("本周一:"+date2);
		
		cal.add(Calendar.DAY_OF_MONTH,6);
		cal.set(Calendar.HOUR_OF_DAY, 23);  
		cal.set(Calendar.MINUTE, 59);  
		cal.set(Calendar.SECOND, 59); 
		Date date3 = new Date(cal.getTimeInMillis());
		System.out.println("本周日:"+date3);
		dates[0] = date2;
		dates[1] = date3;
		cal = null;
		
		return dates;
	}
	
	public static Date getToDay() throws ParseException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.set(Calendar.HOUR_OF_DAY, 0);  
		cal.set(Calendar.MINUTE, 0);  
		cal.set(Calendar.SECOND, 0); 
		Date date = new Date(cal.getTimeInMillis());
		return date;
	}
	
	
	public static Date getDateByString(String date) throws ParseException {
		if (date == null || "".equals(date)) {
			return null;
		}
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date2 = sdf.parse(date);
		
		return date2;
	}
	
	public static Date getDate() throws ParseException {
		Date d = new Date();// 获取时间
		return d ;
	}
	
	
	public static String getSystemDateByLong() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String Long = sdf.format(d);
		
		return Long;
	}
	
	public static Date toYmdDate(String date) throws ParseException {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date2 = sdf.parse(date);
		
		return date2;
	}
	
	/**
	 * 
	* @Title: getSystemDateByYmd 
	* @Description: TODO(获得格式化后的日期(yyy-MM-dd)的系统时间) 
	* @param 
	* @return 格式化后的日期(yyy-MM-dd)的系统时间
	* @throws ParseException
	 */
	public static String getSystemDateByYmd() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String ymd = sdf.format(d);
		
		return ymd;
	}

	/**
	 * 
	* @Title: DateFormatUtils 
	* @Description: TODO(将DATE转成想要的string) 
	* @param 
	* @param date
	* @param parm
	* @return String
	 */
	public static String tranDate(Date date, String parm) {
		String dateStr = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(parm);
			dateStr = sdf.format(date);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		return dateStr;
	}

	/**
	 *
	 * @Title:getSystemDateByYYYYMMDD
	 * @Description: 获得格式化后的日期(yyyyMMddHHmmss)的系统时间
	 * @return
	 * @throws ParseException
	 */
	public static String getSystemDateByYYYYMMDD() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String ymd = sdf.format(d);
		return ymd;
	}

	/**
	 *
	 * @Title:getSystemDateByYmd
	 * @Description: 获得格式化后的日期(yyyMMdd)的系统时间
	 * @return 格式化后的日期(yyyMMdd)的系统时间
	 */
	public static String getSystemDateByyymmdd() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(d);
		return ymd;
	}

	/**
	 *
	 * @Title:getSystemDateByYmd
	 * @Description: 获得格式化后的日期(MM)的系统时间
	 * @return 格式化后的日期(MM)的系统时间
	 */
	public static String getSystemMM() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
		String ymd = sdf.format(d);
		return ymd;
	}

	/**
	 *
	 * @Title:getSystemDateByYmd
	 * @Description: 获得格式化后的日期(yyyMMdd)的系统时间
	 * @return 格式化后的日期(yyyMMdd)的系统时间
	 */
	public static String getSystemYY() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		String ymd = sdf.format(d);
		return ymd;
	}

	/**
	 *
	 * @Title:getSystemDateByYYYYMMDD
	 * @Description: 获得格式化后的日期(yyyyMMddHHmmss)的系统时间
	 * @return
	 * @throws ParseException
	 */
	public static String getSystemDateByYYYYMMDDHHMMSSSSS() throws ParseException {
		Date d = new Date();// 获取时间

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		String ymd = sdf.format(d);
		return ymd;
	}

	/**
	 *
	 * @Title:getSystemDateByYYYYMMDD
	 * @Description: 获得格式化后的日期(根据传入的字符串格式)的系统时间
	 * @return
	 * @throws ParseException
	 */
	public static String getSystemDateByParm(String parm) {
		String ymd = null;
		try {
			Date d = new Date();// 获取时间
			SimpleDateFormat sdf = new SimpleDateFormat(parm);
			ymd = sdf.format(d);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return ymd;
	}
	
	/**
	 *
	 * @Title:getSystemDateByYYYYMMDD
	 * @Description: 根据传入的时间戳和字符串格式获取格式化后的时间
	 * @return
	 * @throws ParseException
	 */
	public static String getStringByTimestampAndParm(Long timestamp,String parm) {
		String ymd = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(parm);
			ymd = sdf.format(timestamp);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return ymd;
	}

	/**
	 *
	 * @Title:getMonthDayForDate
	 * @Description: 根据字符型日期,获取该日期所在月份共有多少天
	 * @param dateFormat
	 *            格式化后的日期(yyy-MM-dd)
	 * @return 该日期所在月份共多少天
	 */
	public static int getMonthDayForDate(String dateFormat) throws ParseException {
		Calendar cDay = Calendar.getInstance();
		DateFormat dd = new SimpleDateFormat("yyyy-MM-dd");
		Date date = dd.parse(dateFormat);
		cDay.setTime(date);
		int lastDay = cDay.getActualMaximum(Calendar.DAY_OF_MONTH);
		return lastDay;
	}

	/**
	 *
	 * @Title:getCalendarByYearMonth
	 * @Description: 根据日期(周一yyyy-MM-dd)获取本周都有哪些天。
	 * @param dateFormat
	 * @return
	 * @throws ParseException
	 */
	public static String[] getCalendarByYearMonth(String dateFormat) throws ParseException {

		Calendar cDay = Calendar.getInstance();
		DateFormat dd = new SimpleDateFormat("yyyy-MM-dd");
		Date date = dd.parse(dateFormat);
		cDay.setTime(date);

		String[] weeks = new String[7];
		String sDay0 = "" + cDay.get(Calendar.DATE);
		if (sDay0.length() > 1) {
			weeks[0] = sDay0;
		} else {
			weeks[0] = "0" + sDay0;
		}
		for (int i = 1; i < 7; i++) {
			cDay.add(Calendar.DATE, 1);
			String sDay = "" + cDay.get(Calendar.DATE);
			if (sDay.length() > 1) {
				weeks[i] = sDay;
			} else {
				weeks[i] = "0" + sDay;
			}
		}

		return weeks;
	}

	/**
	 *
	 * @Title:getCalendarByweek
	 * @Description: 根据传递过来的日期,返回当前日期所在周的时间段
	 * @param dateFormat
	 *            日期("2014-09-19")
	 * @return
	 * @throws ParseException
	 */
	public static String[] getCalendarByweek(String dateFormat) throws ParseException {
		String[] resultarr = new String[2];

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cl = Calendar.getInstance();

		Date d = sdf.parse(dateFormat);

		cl.setTime(d); // nd为传过来的日期,Date 型,此步可省为当前日期
		int day_of_week = cl.get(Calendar.DAY_OF_WEEK) - 1;
		if (day_of_week == 0)
			day_of_week = 7;
		cl.add(Calendar.WEEK_OF_MONTH, 0); // idx 参数,0为当前,1为下周 -1为上周以此类推
		cl.add(Calendar.DATE, -day_of_week + 1);
		String week1 = sdf.format(cl.getTime());// 周一
		resultarr[0] = week1;
		// System.out.println(week1);
		cl.add(Calendar.DATE, +6);
		String week2 = sdf.format(cl.getTime());// 周日
		resultarr[1] = week2;
		// System.out.println(week2);

		return resultarr;
	}

	/**
	 *
	 * @Title:getWeekForDate
	 * @Description: 根据日期(yyyy-MM-dd)获得其是该月的第几周
	 * @param dateFormat
	 *            日期("2014-09-19")
	 * @return
	 * @throws ParseException
	 */
	public static Integer getWeekForDate(String dateFormat) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(dateFormat);
		Calendar calendar = Calendar.getInstance();
		calendar.setFirstDayOfWeek(Calendar.MONTH);
		calendar.setTime(date);
		int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);
		return weekOfMonth;
	}

	/**
	 * @Title: convertToDate @Description: TODO(这里用一句话描述这个方法的作用) @param @param
	 * dateString 要转化的字符串 @param @param parms 转化后的格式,yyyy-MM-dd
	 * HH:mm:ss @param @return 设定文件 @return Date 返回类型 @throws
	 */
	public static Date convertToDate(String dateString, String parms) {
		SimpleDateFormat df = new SimpleDateFormat(parms);
		try {
			Date date = df.parse(dateString);
			return date;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	/**
	 * @Title: countAge @Description: TODO(计算目标日期距离系统当前日期多少天) @param @param
	 * createDate yyyy-MM-dd HH:mm:ss @param @return 设定文件 @return Long 返回类型 @throws
	 */
	public static Long countAge(String createDate) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Long day = 0l;//字母 l
		try {
			String nowDate = DateFormatUtils.getSystemDateByParm("yyyy-MM-dd");
			long to = df.parse(nowDate).getTime();
			long from = df.parse(createDate).getTime();
			day = (to - from) / (1000 * 60 * 60 * 24);
		} catch (ParseException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		return day;
	}

	/**
	 * @Title: getBetweenDay @Description: TODO(判断两个日期之间相差多少天) @param @param
	 * date1 @param @param date2 @param @return 设定文件 @return int 返回类型 @throws
	 */
	public static int getBetweenDay(Date date1, Date date2) {
		Calendar d1 = new GregorianCalendar();
		d1.setTime(date1);
		Calendar d2 = new GregorianCalendar();
		d2.setTime(date2);
		int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
		int y2 = d2.get(Calendar.YEAR);
		if (d1.get(Calendar.YEAR) != y2) {
			// d1 = (Calendar) d1.clone();
			do {
				days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
				d1.add(Calendar.YEAR, 1);
			} while (d1.get(Calendar.YEAR) != y2);
		}
		return days;
	}

	/**
	 * @Title: getCompareDate @Description: TODO(比较两个日期的大小,精确到秒) @param @param
	 * date1 @param @param date2 @param @return 设定文件 @return Boolean 返回类型 @throws
	 */
	public static Boolean getCompareDate(Date date1, Date date2) {
		java.util.Calendar c1 = java.util.Calendar.getInstance();
		java.util.Calendar c2 = java.util.Calendar.getInstance();
		c1.setTime(date1);
		c2.setTime(date2);
		int result = c1.compareTo(c2);
		if (result <= 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * @throws Exception @Title: getSystemDate @Description: TODO(获取yyyy-MM-dd
	 * HH:mm:ss的Date类型) @param @return 设定文件 @return Date 返回类型 @throws
	 */
	public static Date getSystemDate() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date = df.format(new Date());
		System.out.println(date);
		Date dateSyDate = null;
		try {
			dateSyDate = df.parse(date);
		} catch (ParseException e) {
			System.out.println(e.getMessage());
		}
		return dateSyDate;
	}

	/**
	 * @Title: DateDifferentExample @Description:
	 * TODO(计算出两个日期之间相差多少天多少小时多少分多少秒) @param @param d1 @param @param
	 * d2 @param @return 设定文件 @return String 返回类型 @throws
	 */
	public static String DateDifferentExample(Date d1, Date d2) {
		StringBuilder resultString = new StringBuilder();
		try {
			// 毫秒ms
			long diff = d2.getTime() - d1.getTime();

			long diffSeconds = diff / 1000 % 60;
			long diffMinutes = diff / (60 * 1000) % 60;
			long diffHours = diff / (60 * 60 * 1000) % 24;
			long diffDays = diff / (24 * 60 * 60 * 1000);

			resultString.append(diffDays + "天,");
			resultString.append(diffHours + "小时,");
			resultString.append(diffMinutes + " 分钟");
			resultString.append(diffSeconds + "秒.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return resultString.toString();
	}

	/**
	 * 计算2个日期之间相差的  年
	 * @param fromDate
	 * @param toDate
	 * @return
	 */
	public static int yearCompare(Date fromDate,Date toDate){
		Calendar  from  =  Calendar.getInstance();
		from.setTime(fromDate);
		Calendar  to  =  Calendar.getInstance();
		to.setTime(toDate);
		int fromYear = from.get(Calendar.YEAR);
		int toYear = to.get(Calendar.YEAR);
		int year = toYear  -  fromYear;
		return year;
	}

	public static void main(String[] args) throws ParseException {
		System.out.println(yearCompare(getDateByString("2000-1-1 00:00:00"),new Date()));
	}

}