package com.ruoyi.authorize.common;
import org.apache.commons.lang3.time.DateUtils;
import java.text.*;
import java.util.Calendar;
import java.util.Date;
/**
 * 日期时间工具类
 * @author wq
 * @version 1.0
 */
public class DateTimeUtil extends DateUtils
{
	// 以毫秒表示的时间
	private static final long DAY_IN_MILLIS = 24 * 3600 * 1000;
	private static final long HOUR_IN_MILLIS = 3600 * 1000;
	private static final long MINUTE_IN_MILLIS = 60 * 1000;
	private static final long SECOND_IN_MILLIS = 1000;
	
	private static String week[] = {
		"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
	};
	
	/**
	 * 用指定参数抽取时间日期部分
	 * 
例如getDateSplit(System.currentTimeMillis()),"y") 为取得当前的年份
	 * @param date java.util.Date类型时间
	 * @param interval 可选值:
	 * 
y:年
M:月
d/dm:日
dy:参数日期所代表的时间的已过的天数
	 * 
h:12制小时
H:24制小时
m:分
	 * 
s:秒
S:毫秒
w:星期
	 * 
wim:参数日期所代表的月已经过的星期数
	 * 
wm:参数日期所代表的月的星期数
	 * 
wy:参数日期所代表的年的第几周 
	 * @return 格式化好的时间
	 */
	public static int getDateExtract(Date date, String interval)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		if (interval.equalsIgnoreCase("y"))
			return c.get(Calendar.YEAR);
		if (interval.equals("M"))
			return c.get(Calendar.MONTH);
		if (interval.equalsIgnoreCase("d"))
			return c.get(Calendar.DATE);
		if (interval.equalsIgnoreCase("dm"))
			return c.get(Calendar.DAY_OF_MONTH);
		if (interval.equalsIgnoreCase("dy"))
			return c.get(Calendar.DAY_OF_YEAR);
		if (interval.equals("h"))
			return c.get(Calendar.HOUR);
		if (interval.equals("H"))
			return c.get(Calendar.HOUR_OF_DAY);
		if (interval.equals("m"))
			return c.get(Calendar.MINUTE);
		if (interval.equals("s"))
			return c.get(Calendar.SECOND);
		if (interval.equals("S"))
			return c.get(Calendar.MILLISECOND);
		if (interval.equalsIgnoreCase("w"))
			return c.get(Calendar.DAY_OF_WEEK);
		if (interval.equalsIgnoreCase("wim"))
			return c.get(Calendar.DAY_OF_WEEK_IN_MONTH);
		if (interval.equalsIgnoreCase("wm"))
			return c.get(Calendar.WEEK_OF_MONTH);
		if (interval.equalsIgnoreCase("wy"))
			return c.get(Calendar.WEEK_OF_YEAR);
		else
			return -1;
	}
	
	/**
	 * 用指定参数抽取时间日期部分
	 * @param dateStr String类型日期时间
	 * @param format 日期时间格式
	 * @param interval 可选值:
	 * 
y:年
M:月
d/dm:日
dy:参数日期所代表的时间的已过的天数
	 * 
h:12制小时
H:24制小时
m:分
	 * 
s:秒
S:毫秒
w:星期
	 * 
wim:参数日期所代表的月已经过的星期数
	 * 
wm:参数日期所代表的月的星期数
	 * 
wy:参数日期所代表的年的第几周 
	 * @return 格式化好的时间
	 * @throws ParseException
	 */
	public static int getDateExtract(String dateStr, String format, String interval)
		throws ParseException
	{
		SimpleDateFormat sformat = new SimpleDateFormat(format);
		Date date = sformat.parse(dateStr);
		return getDateExtract(date, interval);
	}
	
	/**
	 * @param value 时间
	 * @return yyyy-MM-dd HH:mm:ss格式的时间字符串
	 */
	public static String getSpecifyDateTime(long value)
	{
		return getFormatDateTime(new Date(value), "yyyy-MM-dd HH:mm:ss");
	}
	/**
	 * 转换一个Long型到Date类型
	 * @param value 时间
	 * @return java.util.Date
	 */
	public static Date getDateTime(long value)
	{
		Calendar c = Calendar.getInstance();
		c.setTimeInMillis(value);
		return c.getTime();
	}
	
	/**
	 * 取得当前星期
	 * @return 字符串
	 */
	public static String getCurrentWeek()
	{
		return week[getDateExtract(new Date(), "w") - 1];
	}
	/**
	 * 从给出的时间计算星期
	 * @param date 日期
	 * @return 字符串
	 */
	public static String getWeek(Date date)
	{
		return week[getDateExtract(date, "w") - 1];
	}
	/**
	 * 从给出的时间计算星期
	 * @param dateStr 日期字符串
	 * @param format 日期格式
	 * @return 字符串
	 */
	public static String getWeek(String dateStr, String format)
		throws ParseException
	{
		return week[getDateExtract(dateStr, format, "w") - 1];
	}
	/**
	 * 用指定格式,格式一个日期
	 * @param date
	 * @param format
	 * @return 字符串
	 */
	public static String getFormatDateTime(Date date, String format)
	{
		return (new SimpleDateFormat(format)).format(date);
	}
	/**
	 * string类型时间转为java.util.Date类型时间 yyyy-MM-dd 无时分秒
	 * @param strDate
	 * @return
	 * @throws ParseException
	 */
	public static Date changeStringToDate(String strDate)
		throws ParseException
	{
		if (strDate == null || strDate.equals(""))
			return null;
		else
			return DateFormat.getDateInstance(DateFormat.DEFAULT).parse(strDate);
	}
	/**
	 * 去得紧凑型日期 例如yyyyMMdd
	 * @param data 型如yyyy-MM-dd
	 * @return 字符串
	 */
	public static String getCompactDate(String data)
	{
		if (data == null || data.length() < 10)
		{
			return "";
		} else
		{
			data = (new StringBuilder(String.valueOf(data.substring(0, 4)))).append(data.substring(5, 7)).append(data.substring(8, 10)).toString();
			return data;
		}
	}
	/**
	 * 得到Long型时间从给定yyyy-MM-dd HH:mm:ss型字符串
	 * @param strDate
	 * @return Long型时间
	 * @throws ParseException
	 */
	public static long getLongDate(String strDate) throws ParseException
	{
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = format.parse(strDate);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		Long l = c.getTimeInMillis();
		return l;
	}
	/**
	 * 格式化Long类型时间
	 * @param longDate Long类型时间
	 * @param format 时间格式
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getFormatDate(long longDate, String format) throws ParseException
	{
		DateFormat dformat = new SimpleDateFormat(format);
		Calendar c = Calendar.getInstance();
		c.setTimeInMillis(longDate);
		String dt = dformat.format(c.getTime());
		return dformat.parse(dt);
	}
	/**
	 * 格式化String类型时间
	 * @param strDate String类型时间
	 * @param format 时间格式
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getFormatDate(String strDate, String format) throws ParseException
	{
		DateFormat dformat = new SimpleDateFormat(format);
		return dformat.parse(strDate);
	}
	/**
	 *将字符串格式yyyyMMdd的字符串转为日期,格式"yyyy-MM-dd"
	 *
	 * @param date 日期字符串
	 * @return 返回格式化的日期
	 * @throws ParseException 分析时意外地出现了错误异常
	 */
	public static String strToDateFormat(String date) throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		formatter.setLenient(false);
		Date newDate= formatter.parse(date);
		formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return formatter.format(newDate);
	}
	/**
	 * 格式化Date类型时间
	 * @param date Date类型时间
	 * @param format 时间格式
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getFormatDate(Date date, String format) throws ParseException
	{
		DateFormat dformat = new SimpleDateFormat(format);
		String dt = dformat.format(date);
		return dformat.parse(dt);
	}
	/**
	 * 用指定格式格式化当前时间
	 * 
	 * @param format
	 *  
时间格式 例yyyy-MM-dd HH:mm:ss 
	 *  
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT 
	 *  
"EEE, MMM d, ''yy" 星期五, 三月 9, '12
	 *  
"h:mm a" 12:08 PM 
	 *  
GGG hh:mm aaa" 02001.July.04 AD 12:08 PM 
	 *  
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700 
	 *  
"yyMMddHHmmssZ" 010704120856-0700 
	 *  
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
	 * @return 格式化的时间
	 */
	public static String getCurrentDate(String format)
	{
		return getFormatDateTime(new Date(), format);
	}
	
	/**
	 * 反回一个Long型的当前时间
	 * @return  当前时间
	 */
	public static Long getCurrentLongDate(){
		return new Date().getTime();
	}
	/**
	 * 取得yyyy-MM-dd格式的当前时间
	 * @return 格式化的时间
	 */
	public static String getCurrentDate()
	{
		return getCurrentDate("yyyy-MM-dd");
	}
	
	// ////////////////////////////////////////////////////////////////////////////
	// dateDiff
	// 计算两个日期之间的差值
	// ////////////////////////////////////////////////////////////////////////////
	/**
	 * 计算两个时间之间的差值,根据标志的不同而不同
	 * 
	 * @param flag
	 *            计算标志,表示按照年/月/日/时/分/秒等计算
	 * @param calSrc
	 *            减数
	 * @param calDes
	 *            被减数
	 * @return 两个日期之间的差值
	 */
	public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {
		long millisDiff = calSrc.getTime().getTime() - calDes.getTime().getTime();
		if (flag == 'y') {
			return (calSrc.get(calSrc.YEAR) - calDes.get(calDes.YEAR));
		}
		if (flag == 'd') {
			return (int) (millisDiff / DAY_IN_MILLIS);
		}
		if (flag == 'h') {
			return (int) (millisDiff / HOUR_IN_MILLIS);
		}
		if (flag == 'm') {
			return (int) (millisDiff / MINUTE_IN_MILLIS);
		}
		if (flag == 's') {
			return (int) (millisDiff / SECOND_IN_MILLIS);
		}
		return 0;
	}
	/**
	 * 传入时间加上或减去指定的时间间隔
	 * @param date
	 * @param interval
	 * @return
	 */
	public static Date addDay(Date date, int interval) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_MONTH, interval);
		return cal.getTime();
	}
	/**
	 * 传入时间 加上或减去 小时
	 * @param date
	 * @param interval
	 * @return
	 */
	public static Date addHour(Date date, int interval){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.HOUR_OF_DAY, interval);
		return cal.getTime();
	}
	/*
	 * 传入时间 加上或减去 分钟
	 */
	public static Date addMinute(Date date, int interval){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, interval);
		return cal.getTime();
	}
	/*
	 * 传入时间 加上或减去 秒
	 */
	public static Date addSecond(Date date, int interval){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.SECOND, interval);
		return cal.getTime();
	}
//	public static void main(String args[]) throws ParseException
//	{
//		System.out.println(getFormatDateTime(addDay(new Date(),-3), "yyyy-MM-dd HH:mm:ss"));
//	}
}