package abacus.springboot.example.util;

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

import com.alibaba.fastjson.JSON;

/**
 * Title: 日期时间 Description: 工具类
 * 
 * @author xuelin chen
 * @version 1.0
 */
public class DateUtil {

	/** 本地化 */
	private static Locale locale = Locale.SIMPLIFIED_CHINESE;

	/** 缺省的DateFormat对象，可以将一个java.util.Date格式化成 yyyy-mm-dd 输出 */
	private static DateFormat dateDF = new SimpleDateFormat("yyyy-MM-dd");

	/** 缺省的DateFormat对象，可以将一个java.util.Date格式化成 HH:SS:MM 输出 */
	private static DateFormat timeDF = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);

	/** 缺省的DateFormat对象，可以将一个java.util.Date格式化成 yyyy-mm-dd HH:SS:MM 输出 */
//	private static DateFormat datetimeDF = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);

	private static DateFormat datetimeDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	private static DateFormat fdt = new SimpleDateFormat("yyyyMMddHHmmss");
	private static DateFormat fdtsss = new SimpleDateFormat("yyyyMMddHHmmssSSS");
	
	public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 私有构造函数，表示不可实例化
	 */
	private DateUtil() {
	}
	
	/**
	 * 将任意时间生成为当天的第一秒 如:2013-10-23 0:12:12 生成为 2013-10-23 00:00:00
	 * @param from 时间对象
	 * @return
	 */
	public static Date getFromDate(Date from) {
		if (from == null) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(new Date(from.getTime()));
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 将任意时间生成为当天的最后一秒 如:2013-10-23 0:12:12 生成为 2013-10-23 23:59:59
	 * @param thru 时间对象
	 * @return
	 */
	public static Date getThruDate(Date thru) {
		if (thru == null) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(new Date(thru.getTime()));
		cal.set(Calendar.HOUR_OF_DAY, 23);
		cal.set(Calendar.MINUTE, 59);
		cal.set(Calendar.SECOND, 59);
		cal.set(Calendar.MILLISECOND, 998);
		return cal.getTime();
	}
	
	/**
	 * 	时间减去几个小时  
	 * @param dateStart
	 * @param num
	 * @return  dateStart-num
	 */
	public static java.util.Date nowDateMinusHour(java.util.Date dateStart, int num) {
		try {
			Calendar cal = Calendar.getInstance();
		    cal.setTime(dateStart);
		    cal.add(Calendar.HOUR_OF_DAY, -num);
		   return cal.getTime();
		} catch (Exception ex) {
			return null;
		}
	}
	
	/**
	 * 	时间减几分钟
	 * @param dateStart
	 * @param num
	 * @return
	 */
	public static java.util.Date nowDateMinusTime(java.util.Date dateStart, int num) {
		try {
			Calendar cal = Calendar.getInstance();
		    cal.setTime(dateStart);
		    cal.add(Calendar.MINUTE, -num);
		   return cal.getTime();
		} catch (Exception ex) {
			return null;
		}
	}


	/** 返回当前日期格式 yyyyMMddHHmmss*/
	public static String getDateFormat(Date date) {
		if (date == null)
			date = new Date();
		return fdt.format(date);
	}
	
	public static String getDateFormatsss(Date date) {
		if (date == null)
			date = new Date();
		return fdtsss.format(date);
	}

	/**
	 * 返回一个当前的时间，并按格式转换为字符串 例：17:27:03
	 * 
	 * @return String
	 */
	public static String getTime() {
		GregorianCalendar gcNow = new GregorianCalendar();
		java.util.Date dNow = gcNow.getTime();
		return timeDF.format(dNow);
	}

	/**
	 * 返回一个当前日期，并按格式转换为字符串 例：2009-12-12
	 * 
	 * @return String
	 */
	public static String getDate() {
		GregorianCalendar gcNow = new GregorianCalendar();
		java.util.Date dNow = gcNow.getTime();
		return dateDF.format(dNow);
	}

	/**
	 * 返回一个当前日期和时间，并按格式转换为字符串 例：2009-12-08 14:27:03
	 * 
	 * @return String
	 */
	public static String getDateTime() {
		GregorianCalendar gcNow = new GregorianCalendar();
		java.util.Date dNow = gcNow.getTime();
		return datetimeDF.format(dNow);
	}

	/**
	 * 返回当前年的年号
	 * 
	 * @return int
	 */
	public static int getYear() {
		GregorianCalendar gcNow = new GregorianCalendar();
		return gcNow.get(GregorianCalendar.YEAR);
	}

	/**
	 * 返回本月月号：从 0 开始
	 * 
	 * @return int
	 */
	public static int getMonth() {
		GregorianCalendar gcNow = new GregorianCalendar();
		return gcNow.get(GregorianCalendar.MONTH);
	}

	/**
	 * 返回今天是本月的第几天
	 * 
	 * @return int 从1开始
	 */
	public static int getToDayOfMonth() {
		GregorianCalendar gcNow = new GregorianCalendar();
		return gcNow.get(GregorianCalendar.DAY_OF_MONTH);
	}

	/**
	 * 返回本月的第一天
	 * 
	 */

	/**
	 * 返回一格式化的日期
	 * 
	 * @param date
	 *            java.util.Date
	 * @return String yyyy-mm-dd 格式
	 */
	public static String formatDate(java.util.Date date) {
		return dateDF.format(date);
	}

	/**
	 * 返回一格式化的日期
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDate(long date) {
		return formatDate(new java.util.Date(date));
	}

	/**
	 * 返回一格式化的时间
	 * 
	 * @param date
	 *            Date
	 * @return String hh:ss:mm 格式
	 */
	public static String formatTime(java.util.Date date) {
		return timeDF.format(date);
	}

	/**
	 * 返回一格式化的时间
	 * 
	 * @param date
	 * @return
	 */
	public static String formatTime(long date) {
		return formatTime(new java.util.Date(date));
	}

	/**
	 * 返回一格式化的日期时间
	 * 
	 * @param date
	 *            Date
	 * @return String yyyy-mm-dd hh:ss:mm 格式
	 */
	public static String formatDateTime(java.util.Date date) {
		return datetimeDF.format(date);
	}

	/**
	 * 返回一格式化的日期时间
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDateTime(long date) {
		return formatDateTime(new java.util.Date(date));
	}

	/**
	 * 将字串转成日期和时间，字串格式: yyyy-MM-dd HH:mm:ss
	 * 
	 * @param string
	 *            String
	 * @return Date
	 */
	public static java.util.Date toDateTime(String string) {
		try {
			DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			return (java.util.Date) formatter.parse(string);
		} catch (Exception ex) {
			return null;
		}
	}

	/**
	 * 将字串转成日期，字串格式: yyyy-MM-dd
	 * 
	 * @param string
	 *            String
	 * @return Date
	 */
	public static java.util.Date toDate(String string) {
		try {
			DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
			return (java.util.Date) formatter.parse(string);
		} catch (Exception ex) {
			return null;
		}
	}
	
	/**
	 * 将字串转成日期，字串格式: yyyyMMdd 转换成 yyyy-MM-dd
	 * 
	 * @param string
	 *            String
	 * @return Date
	 */
	public static String toDateyymmdd(String string) {
		try {
			DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
			return  dateDF.format((java.util.Date)formatter.parse(string));
		} catch (Exception ex) {
			return null;
		}
	}

	/**
	 * 取值：某日期的年号
	 * 
	 * @param date
	 *            格式: yyyy-MM-dd
	 * @return
	 */
	public static int getYear(String date) {
		java.util.Date d = toDate(date);
		if (d == null)
			return 0;

		Calendar calendar = Calendar.getInstance(locale);
		calendar.setTime(d);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 取值：某日期的月号
	 * 
	 * @param date
	 *            格式: yyyy-MM-dd
	 * @return 从0开始
	 */
	public static int getMonth(String date) {
		java.util.Date d = toDate(date);
		if (d == null)
			return 0;

		Calendar calendar = Calendar.getInstance(locale);
		calendar.setTime(d);
		return calendar.get(Calendar.MONTH);
	}

	/**
	 * 取值：某日期的日号
	 * 
	 * @param date
	 *            格式: yyyy-MM-dd
	 * @return 从1开始
	 */
	public static int getDayOfMonth(String date) {
		java.util.Date d = toDate(date);
		if (d == null)
			return 0;

		Calendar calendar = Calendar.getInstance(locale);
		calendar.setTime(d);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 计算两个日期的年数差
	 * 
	 * @param one
	 *            格式: yyyy-MM-dd
	 * @param two
	 *            格式: yyyy-MM-dd
	 * @return
	 */
	public static int compareYear(String one, String two) {
		return getYear(one) - getYear(two);
	}

	/**
	 * 计算岁数
	 * 
	 * @param date
	 *            格式: yyyy-MM-dd
	 * @return
	 */
	public static int compareYear(String date) {
		return getYear() - getYear(date);
	}

	/**
	 * 使用format格式化Date对象为字符串
	 * 
	 * @param date
	 *            date
	 * @return String
	 */
	public static String getDateString(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(date);
	}
	
	public static String getyyyyMMdd(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		return format.format(date);
	}
	
	public static String getHHmmss(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("HHmmss");
		return format.format(date);
	}

	/**
	 * 使用format格式化Date对象为字符串,获取年份
	 * 
	 * @param date
	 *            date
	 * @return String
	 */
	static public String getYear(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy");
		return format.format(date);
	}

	/**
	 * 使用format格式化Date对象为字符串,获取月份
	 * 
	 * @param date
	 *            date
	 * @return String
	 */
	static public String getMonth(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("MM");
		return format.format(date);
	}

	/**
	 * 使用format格式化Date对象为字符串,获取日份
	 * 
	 * @param date
	 *            date
	 * @return String
	 */
	static public String getDay(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("dd");
		return format.format(date);
	}

	/**
	 * 使用format格式化Date对象为字符串,获取中文表示的年月日
	 * 
	 * @param date
	 *            date
	 * @return String 2009年12月08日
	 */
	static public String getDateStrC(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
		return format.format(date);
	}

	/**
	 * 使用format格式化Date对象为字符串,获取年份
	 * 
	 * @param date
	 *            date
	 * @return String 20091208
	 */
	static public String getDateStrMonth(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat format = new SimpleDateFormat("yyyyMM");
		String str = format.format(date);
		return str;
	}

	/**
	 * 使用format格式化Date对象为字符串,获取年份
	 * 
	 * @param date
	 *            date
	 * @return String 20091208
	 */
	static public String getDateStrCompact(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		String str = format.format(date);
		return str;
	}

	/**
	 * 使用format格式化Date对象为字符串,获取年月日和时间
	 * 
	 * @param date
	 *            date
	 * @return String 2009年12月8日 14时03分10秒
	 */
	static public String getDateTimeStrC(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		return format.format(date);
	}

	/**
	 * 获取指定日期当前小时起始时间
	 */
	static public Date getCurrentHoursFirstSecound(java.util.Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH");
		String dateStr = format.format(date);
		return toDateTime(dateStr + ":00:00");

	}

	/**
	 * 获取指定日期当前下一个小时时间
	 */
	static public Date getCurrentNextHours(java.util.Date date) {
		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.HOUR, 1);
		return new Date(scalendar.getTime().getTime());
	}

	/**
	 * 获取指定日期后下一个月的第一天
	 * 
	 * @param java.sql.Date
	 *            date
	 * @return java.sql.Date
	 */
	static public java.sql.Date getNextMonthFirstDate(java.util.Date date) throws ParseException {
		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.MONTH, 1);
		scalendar.set(Calendar.DATE, 1);
		return new java.sql.Date(scalendar.getTime().getTime());
	}

	static public java.sql.Date getNextMonthDate(java.util.Date date) {
		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.MONTH, 1);
		return new java.sql.Date(scalendar.getTime().getTime());
	}

	/** 上一个月 */
	public static Date getLastMonthFirstDate(Date date, int month) {
		if (date == null)
			return date;
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, month);
		date = calendar.getTime();
		return date;
	}

	/**
	 * 获取指定日期的前面几天
	 * 
	 * @param java.sql.Date
	 *            date
	 * @param dayCount
	 *            表示前几天
	 * @return java.sql.Date
	 */
	static public java.sql.Date getFrontDateByDayCount(java.sql.Date date, int dayCount) throws ParseException {
		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.DATE, -dayCount);
		return new java.sql.Date(scalendar.getTime().getTime());
	}

	/**
	 * 取得指定年份和月份的第一天
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public Date getFirstDay(String year, String month) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.parse(year + "-" + month + "-1");
	}

	/**
	 * 取得指定年份和月份的第一天
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public Date getFirstDay(int year, int month) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.parse(year + "-" + month + "-1");
	}

	/**
	 * 取得指定年份和月份的最后一天
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public Date getLastDay(String year, String month) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(year + "-" + month + "-1");

		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.MONTH, 1);
		scalendar.add(Calendar.DATE, -1);
		date = scalendar.getTime();
		return date;
	}

	/**
	 * 取得指定年份和月份的最后一天
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public Date getLastDay(int year, int month) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(year + "-" + month + "-1");

		Calendar scalendar = new GregorianCalendar();
		scalendar.setTime(date);
		scalendar.add(Calendar.MONTH, 1);
		scalendar.add(Calendar.DATE, -1);
		date = scalendar.getTime();
		return date;
	}

	/**
	 * 取得指定年份之间的相隔月数
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public long getDistinceMonth(String beforedate, String afterdate) throws ParseException {
		SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd");
		long monthCount = 0;
		try {
			java.util.Date before = d.parse(beforedate);
			java.util.Date after = d.parse(afterdate);

			monthCount = (Integer.parseInt(DateUtil.getYear(after)) - Integer.parseInt(DateUtil.getYear(before))) * 12
					+ DateUtil.getMonth(afterdate) - DateUtil.getMonth(beforedate);

		} catch (ParseException e) {
			System.out.println("Date parse error!");
		}
		return monthCount;
	}

	/**
	 * 取得指定年份之间的相隔天数
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @return Date
	 */
	static public long getDistinceDay(String beforedate, String afterdate) throws ParseException {
		SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd");
		long dayCount = 0;
		try {
			java.util.Date d1 = d.parse(beforedate);
			java.util.Date d2 = d.parse(afterdate);

			dayCount = (d2.getTime() - d1.getTime()) / (24 * 60 * 60 * 1000);

		} catch (ParseException e) {
			System.out.println("Date parse error!");
			// throw e;
		}
		return dayCount;
	}

	/**
	 * 指定日期加一天
	 * 
	 * @param date
	 * @param day
	 * @return
	 */
	static public Date getDaytoDay(Date date, int day) {
		if (date == null)
			return date;

		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, day);
		date = calendar.getTime();
		return date;
	}

	static public Date getMonthtoMonth(Date date, int day) {
		if (date == null)
			return date;

		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, day);
		date = calendar.getTime();
		return date;
	}

	// 获取上一年或者下一年
	static public Date getYeartoYaer(Date date, int year) {
		if (date == null)
			return date;

		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.YEAR, year);
		date = calendar.getTime();
		return date;
	}

	// 指定日期的最开始时间
	public static Date getDateStartTime(Date date) {
		if (date == null)
			return null;
		try {
			String strDate = formatDate(date);
			return toDateTime(strDate + " 00:00:00");
		} catch (Exception localException) {
		}
		return null;
	}

	static public Date getDateLastTime(Date date) {
		if (date == null)
			return null;
		try {
			String strDate = formatDate(date);
			return toDateTime(strDate + " 23:59:59");
		} catch (Exception localException) {
		}
		return null;
	}
	
	// 单位秒
	static public long getDistinceFen(String beforedate, String afterdate) throws ParseException {
		SimpleDateFormat d = new SimpleDateFormat(DATE_TIME_FORMAT);
		long dayCount = 0;
		try {
			java.util.Date d1 = d.parse(beforedate);
			java.util.Date d2 = d.parse(afterdate);

			dayCount = (d2.getTime() - d1.getTime()) / (1000);

		} catch (ParseException e) {
			System.out.println("Date parse error!");
			// throw e;
		}
		return dayCount;
	}
	
	static public Date getMINUTE(Date date, int day) {
		if (date == null)
			return date;

		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.MINUTE, day);
		date = calendar.getTime();
		return date;
	}
	
	static public String CalTimeDifference(String fromTime, int overTime) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = dateFormat.parse(fromTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR, overTime);//这里是分钟，如果需要，可以更换为day,moth
        Date date1 = calendar.getTime();
        
        Timestamp overQTimeKey = new Timestamp(calendar.getTime().getTime());
        SimpleDateFormat overQTimeDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return overQTimeDateFormat.format(overQTimeKey);
    }
	
	/**
	 * 10位时间戳
	 * @return
	 */
	static public String tenBitTime() {
		return String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
	}
	
	
	/**
	 * 使用format格式化Date对象为字符串
	 * 
	 * @param date
	 *            date
	 * @return String
	 */
	public static String getDatetoUpperCaseString() {
        // 获取当前日期
        Calendar calendar = Calendar.getInstance();
        
        // 转换成大写
        String year = toUpperCase(String.valueOf(calendar.get(Calendar.YEAR)));
        String month = toUpperCase(String.valueOf(calendar.get(Calendar.MONTH) + 1));
        String day = toUpperCase(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
        
        // 组合成大写格式
        String dateInChinese = year + "年" + month + "月" + day + "日";
		return dateInChinese;
	}
	
    // 将数字字符串转换成大写
    private static String toUpperCase(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            switch (c) {
                case '0': sb.append('零'); break;
                case '1': sb.append('一'); break;
                case '2': sb.append('二'); break;
                case '3': sb.append('三'); break;
                case '4': sb.append('四'); break;
                case '5': sb.append('五'); break;
                case '6': sb.append('六'); break;
                case '7': sb.append('七'); break;
                case '8': sb.append('八'); break;
                case '9': sb.append('九'); break;
                default: sb.append(c);
            }
        }
        return sb.toString();
    }

	public static void main(String[] args) throws ParseException {
		// System.out.println(getDateStrC(getDaytoDay(new Date(),-7)));
		// System.out.println(getDateFormat(null));
		// getDistinceFen
		
//		SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		
		String code = "";
		
		String[] codearray = code.split("/");
		System.out.println(JSON.toJSONString(codearray));
		System.out.println(codearray[codearray.length - 1]);
		
		System.out.println(getDatetoUpperCaseString());
		
		
//		System.out.println(formatDateTime(nowDateMinusTime(toDateTime("2023-19-27 00:00:00"), -10)));
//		 System.out.println(new Date().getTime());
//		 System.out.println(1614849936503L - new Date().getTime());
//		DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
			// 第一个当前日期     第二个证照有效的日期
//			Long s = DateUtil.getDistinceDay(DateUtil.getDate(), DateUtil.toDates("20190228"));
//			System.out.println(s);
//			System.out.println(DateUtil.toDateyymmdd("20180817"));
			// TODO Auto-generated catch block

		/*
		 * try { System.out.println(getDateFormat(null)); } catch
		 * (ParseException e) { // TODO Auto-generated catch block
		 * e.printStackTrace(); }
		 */
	}
}
