package com.dxhy.customs.utils;

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

/**
 * @author dxhy
 */
@SuppressWarnings("AlibabaUndefineMagicConstant")
public class DateUtil {
    /**
     * 判断日期date3是否在两个日期范围之内
     *
     * @param s1
     *            yyyyMMdd
     * @param s2
     *            yyyyMMdd
     * @param s3
     *            yyyy-MM-dd
     */
    public static boolean isInTwoDate(String s1, String s2, String s3) throws Exception {
        boolean flag = false;
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");
        Date date1 = simpleDateFormat2.parse(s1);
        Date date2 = simpleDateFormat2.parse(s2);

        Date date3 = simpleDateFormat1.parse(s3);

        if (date1.getTime() <= date3.getTime() && date2.getTime() >= date3.getTime()) {
            flag = true;
        }
        return flag;
    }

    /**
     * 判断日期date3是否在两个日期范围之内
     *
     * @param s1
     *            yyyy-MM-dd
     * @param s2
     *            yyyy-MM-dd
     * @param s3
     *            yyyy-MM-dd
     */
    public static boolean isInTwoDateNew(String s1, String s2, String s3) throws Exception {
        boolean flag = false;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = simpleDateFormat.parse(s1);
        Date date2 = simpleDateFormat.parse(s2);

        Date date3 = simpleDateFormat.parse(s3);

        if (date1.getTime() <= date3.getTime() && date2.getTime() >= date3.getTime()) {
            flag = true;
        }
        return flag;
    }

    /**
     * 判断日期date1是否在date2之前
     *
     * @param s1
     *            yyyy-MM-dd
     * @param s2
     *            yyyyMM
     */
    public static boolean isBeforeDate(String s1, String s2) throws Exception {
        boolean flag = false;
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMM");
        SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy-MM");
        SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = simpleDateFormat1.parse(s1);
        Date date2 = simpleDateFormat2.parse(s2);

        String str = simpleDateFormat3.format(date2);
        str = str + "-01";

        str = getEndDateOfMonth(str) + " 23:59:59";

        Date date3 = simpleDateFormat4.parse(str);

        if (date1.getTime() <= date3.getTime()) {
            flag = true;
        }

        return flag;
    }

    /**
     * 将短时间格式字符串转换为时间 yyyy-MM-dd
     *
     * @param strDate
     * @return
     */
    public static Date strToDate(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        ParsePosition pos = new ParsePosition(0);
        return formatter.parse(strDate, pos);
    }

    /**
     * 判断是否润年
     *
     * @param ddate
     * @return
     */
    public static boolean isLeapYear(String ddate) {
        /**
         * 详细设计： 1.被400整除是闰年，否则： 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年 3.能被4整除同时能被100整除则不是闰年
         */
        Date d = strToDate(ddate);
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(d);
        int year = gc.get(Calendar.YEAR);
        if ((year % 400) == 0) {
            return true;
        } else if ((year % 4) == 0) {
            return (year % 100) != 0;
        } else {
            return false;
        }
    }

    /**
     * 获取一个月的最后一天
     *
     * @param dat
     * @return
     */
    public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
        String str = dat.substring(0, 8);
        String month = dat.substring(5, 7);
        int mon = Integer.parseInt(month);
        if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) {
            str += "31";
        } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
            str += "30";
        } else {
            if (isLeapYear(dat)) {
                str += "29";
            } else {
                str += "28";
            }
        }
        return str;
    }

    public static boolean compare(Date date1, Date date2) {
        return date1.getTime() == date2.getTime();
    }

}
