package com.huatek.busi.util;

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

/**
 * <p>
 * 功能:日期时间工具类
 * </p>
 * 
 * @author flydr
 * 
 */
public class DateUtil {

	/**
	 * 年
	 */
	public static final int YEAR = Calendar.YEAR;
	/**
	 * 月
	 */
	public static final int MONTH = Calendar.MONTH;
	/**
	 * 日
	 */
	public static final int DATE = Calendar.DATE;
	/**
	 * 时
	 */
	public static final int HOUR = Calendar.HOUR;
	/**
	 * 分钟
	 */
	public static final int MINUTE = Calendar.MINUTE;

	/**
	 * 秒
	 */
	public static final int SECOND = Calendar.SECOND;

	public static long getLocalTime(Date date) {
		long l = date.getTime();
		l = l / 1000;
		return l;
	}

	public static Date getLocalDate(long l) {
		l = l * 1000;
		Date date = new Date(l);
		return date;
	}

	/**
	 * 获得指定日期的字符串形式
	 * 
	 * @param date
	 *            指定日期
	 * @param formate
	 *            日期格式
	 * @return
	 */
	public static String getDateStr(Date date, String formate) {
		String result = null;
		if (date == null) {
			return null;
		}
		SimpleDateFormat dateformate = new SimpleDateFormat(formate);
		result = dateformate.format(date);
		return result;
	}

	/**
	 * 将指定格式的日期字符串转换为新的日期格式字符串
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param srcFormat
	 *            源日期格式
	 * @param destFormat
	 *            目标日期格式
	 * @return
	 * @throws ParseException
	 */
	public static String getDateStr(String dateStr, String srcFormat, String destFormat) throws ParseException {
		SimpleDateFormat dateformate = new SimpleDateFormat(srcFormat);
		String str = null;
		Date date = dateformate.parse(dateStr);
		dateformate = new SimpleDateFormat(destFormat);
		str = dateformate.format(date);
		return str;
	}

	/**
	 * 将日期字符串转换日期类型
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param format
	 *            日期格式
	 * @return
	 * @throws ParseException
	 */
	public static Date getDate(String dateStr, String format) throws RuntimeException {
		Date date = null;
		if (dateStr == null || dateStr.equals("")) {
			return null;
		}
		SimpleDateFormat dateformate = new SimpleDateFormat(format);

		try {
			date = dateformate.parse(dateStr);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		return date;
	}

	/**
	 * 取得服务器的日期字符串，日期格式为“yyyy-MM-dd”
	 * 
	 * @return 日期字符串
	 */
	public static String getSysDateStr() {
		return DateUtil.getDateStr(new Date(), "yyyy-MM-dd");
	}

	/**
	 * 取得服务器的日期时间字符串，日期格式为“yyyy-MM-dd HH:mm:ss”
	 * 
	 * @return 日期字符串
	 */
	public static String getSysDateTimeStr() {
		return DateUtil.getDateStr(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 时间加法（分钟）
	 * 
	 * @param date
	 * @param minTimeLen
	 * @return
	 */
	public static Date addTime(Date date, int timeLen, int type) {
		if (date == null) {
			return null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(type, timeLen);
		return calendar.getTime();
	}

	public static Integer getAge(Date date) {
		Date today = new Date();
		today = getDate(getDateStr(today, "yyyy-MM-dd"), "yyyy-MM-dd");
		Integer todayYear = Integer.parseInt(getDateStr(today, "yyyy"));
		Integer year = Integer.parseInt(getDateStr(date, "yyyy"));
		Integer age = todayYear- year ;
		Date newDate = addTime(date, age, YEAR);
		if (newDate.after(today)) {
			age = age - 1;
		}
		return age;
	}

	public static void main(String[] arps) throws ParseException {
		//System.out.println( DateUtil.getDateByType(new Date(), -1, "day"));
		//System.out.println(DateUtil.getDateStr( DateUtil.getDateByType(new Date(), -1, "day"), "yyyy-MM-dd"));
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
		Date dateByType = DateUtil.getDateByType(new Date(), -1, "day",sdf2);
		System.out.println( dateByType);
		System.out.println(sdf2.format(dateByType));

		Date end = DateUtil.getDateByType(new Date(), -1, "day",sdf2);
		Date start = DateUtil.getDateByType(end, -4, "month", sdf2 );

		System.out.println( sdf2.format(end));
		System.out.println(sdf2.format(start));


	}

	/**
	 * source 在 target 之前
	 * 
	 * @param source
	 * @param target
	 * @return
	 */
	public static int compareDate(Date source, Date target) {
		try {
			if (source.getTime() < target.getTime()) {
				// System.out.println("dt1 在dt2前");
				return 1;
			} else if (source.getTime() > target.getTime()) {
				// System.out.println("dt1在dt2后");
				return -1;
			} else {
				return 0;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return 0;
	}

	/**
	 * 根据当前时间 推算时间
	 * 
	 * @author 
	 * @date 2016年11月30日
	 * @param startDate
	 * @param num
	 *            -n 向前推n ; n 向后推n
	 * @param type
	 *            year:年; week:周 ; month:月;
	 * @return
	 */
	public static Date getDateByType(Date startDate, int num, String type) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(startDate);
		if (type.equals("month")) {
			calendar.add(Calendar.MONTH, num);// 推一月
		} else if (type.equals("week")) {
			calendar.add(Calendar.WEEK_OF_YEAR, num); // 推一周
		} else if (type.equals("year")) {
			calendar.add(Calendar.YEAR, num); // 推一年
		}else if (type.equals("day")) {
			calendar.add(Calendar.DATE, num); // 推一年
		}else if (type.equals("hour")) {
			calendar.add(Calendar.HOUR, num); // 推一年
		}else if (type.equals("minute")) {
			calendar.add(Calendar.MINUTE, num); // 推一年
		}
		return calendar.getTime();
	}
	
	
	/**
	 * 根据当前时间 推算时间
	 * 
	 * @author 
	 * @date 2016年11月30日
	 * @param startDate
	 * @param num
	 *            -n 向前推n ; n 向后推n
	 * @param type
	 *            year:年; week:周 ; month:月;
	 * @return
	 * @throws ParseException 
	 */
	public static Date getDateByType(Date startDate, int num, String type,  SimpleDateFormat format) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(startDate);
		if (type.equals("month")) {
			calendar.add(Calendar.MONTH, num);// 推一月
		} else if (type.equals("week")) {
			calendar.add(Calendar.WEEK_OF_YEAR, num); // 推一周
		} else if (type.equals("year")) {
			calendar.add(Calendar.YEAR, num); // 推一年
		}else if (type.equals("day")) {
			calendar.add(Calendar.DATE, num); // 推一年
		}else if (type.equals("hour")) {
			calendar.add(Calendar.HOUR, num); // 推一年
		}else if (type.equals("minute")) {
			calendar.add(Calendar.MINUTE, num); // 推一年
		}
		Date time = calendar.getTime();
		String tmp = format.format(time);
		return format.parse(tmp);
	}
	
	
	
}
