package com.cm.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

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

/**
 * 说明：日期处理 创建人：CM 修改时间：2015年11月24日
 */
public class DateUtil {

    public final static String AM = "AM";
    public final static String PM = "PM";
    public final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
    public final static SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
    public final static SimpleDateFormat sdfd = new SimpleDateFormat("dd");
    public final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
    public final static SimpleDateFormat sdfDayZh = new SimpleDateFormat("yyyy年MM月dd日");
    public final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
    public final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss");
    public final static SimpleDateFormat sdfYearMonth = new SimpleDateFormat("yyyyMM");

    public static String getZhDate(String date) {
        try {
            return sdfDayZh.format(sdfDay.parse(date));
        } catch (Exception e) {
            e.printStackTrace();
            return date;
        }
    }

    /**
     * 校验日期格式
     *
     * @param date
     * @param simpleDateFormat
     * @return
     */
    public static boolean checkFormat(String date, SimpleDateFormat simpleDateFormat) {
        if (StringUtils.isEmpty(date) || simpleDateFormat == null) {
            return false;
        }
        try {
            simpleDateFormat.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

    /**
     * 获取YYYYMM格式
     *
     * @return
     */
    public static String getSdfYearMonth() {
        return sdfYearMonth.format(new Date());
    }

    /**
     * 获取YYYYMMDDHHMMSS格式
     *
     * @return
     */
    public static String getSdfTimes() {
        return sdfTimes.format(new Date());
    }

    /**
     * 获取YYYY格式
     *
     * @return
     */
    public static String getYear() {
        return sdfYear.format(new Date());
    }

    /**
     * 获取MM格式
     *
     * @return
     */
    public static String getMonth() {
        return sdfMonth.format(new Date());
    }

    /**
     * 获取dd格式
     *
     * @return
     */
    public static String getToday() {
        return sdfd.format(new Date());
    }

    /**
     * 获取YYYY-MM-DD格式
     *
     * @return
     */
    public static String getDay() {
        return sdfDay.format(new Date());
    }

    /**
     * 获取YYYYMMDD格式
     *
     * @return
     */
    public static String getDays() {
        return sdfDays.format(new Date());
    }

    /**
     * 获取YYYY-MM-DD HH:mm:ss格式
     *
     * @return
     */
    public static String getTime() {
        return sdfTime.format(new Date());
    }

    /**
     * 截取日期
     *
     * @param datetime
     * @return
     */
    public static String getDate(String datetime) {
        return datetime.substring(0, 10);
    }

    /**
     * @param s
     * @param e
     * @return boolean
     * @throws @author fh
     * @Title: compareDate
     * @Description: TODO(日期比较 ， 如果s > = e 返回true 否则返回false)
     */
    public static boolean compareDate(String s, String e) {
        if (fomatDate(s) == null || fomatDate(e) == null) {
            return false;
        }
        return fomatDate(s).getTime() >= fomatDate(e).getTime();
    }

    /**
     * 格式化日期
     *
     * @param date
     * @return
     */
    public static Date fomatDate(String date) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return fmt.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 校验日期是否合法
     *
     * @param s
     * @return
     */
    public static boolean isValidDate(String s) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            fmt.parse(s);
            return true;
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            return false;
        }
    }

    /**
     * @param startTime
     * @param endTime
     * @return
     */
    public static int getDiffYear(String startTime, String endTime) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            // long aa=0;
            int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(startTime).getTime()) / (1000 * 60 * 60 * 24))
                    / 365);
            return years;
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            return 0;
        }
    }

    /**
     * <li>功能描述：时间相减得到天数
     *
     * @param beginDateStr
     * @param endDateStr
     * @return long
     * @author Administrator
     */
    public static long getDaySub(String beginDateStr, String endDateStr) {
        long day = 0;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date beginDate = null;
        Date endDate = null;

        try {
            beginDate = format.parse(beginDateStr);
            endDate = format.parse(endDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
        // System.out.println("相隔的天数="+day);

        return day;
    }

    /**
     * 得到n天之后的日期
     *
     * @param days
     * @return
     */
    public static String getAfterDayDate(String days) {
        int daysInt = Integer.parseInt(days);

        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();

        SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfd.format(date);

        return dateStr;
    }

    /**
     * 得到n天之后是周几
     *
     * @param days
     * @return
     */
    public static String getAfterDayWeek(String days) {
        int daysInt = Integer.parseInt(days);
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        String dateStr = sdf.format(date);
        return dateStr;
    }

    /**
     * 计算年龄生日格式yyyy-MM-dd
     *
     * @param birth
     * @return
     */
    public static String getAge(String birth) {
        int cYear = Integer.parseInt(getYear());
        String[] births = birth.split("-");
        int year = Integer.parseInt(births[0]);
        if (cYear <= year) {
            return "0";
        }
        int cMonth = Integer.parseInt(getMonth());
        int cDay = Integer.parseInt(getToday());
        int month = Integer.parseInt(births[1]);
        int day = Integer.parseInt(births[2]);
        int age = cYear - year;
        if (cMonth - month > 0) {
            return String.valueOf(age);
        }
        if (cDay - day > 0) {
            return String.valueOf(age);
        }
        return String.valueOf(age - 1);
    }

    /**
     * 获取本周周一的日期
     */
    public static String weekStartDate(String pattern) {
        return new DateTime().dayOfWeek().withMinimumValue().toString(pattern);
    }

    /**
     * 获取本周周一的日期
     */
    public static Date weekStartDate() {
        return new DateTime().dayOfWeek().withMinimumValue().toDate();
    }

    /**
     * 获取本周最后一天
     *
     * @return
     */
    public static String weekEndDate(String pattern) {
        return new DateTime().dayOfWeek().withMaximumValue().toString(pattern);
    }

    /**
     * 获取本周最后一天
     *
     * @return
     */
    public static Date weekEndDate() {
        return new DateTime().dayOfWeek().withMaximumValue().toDate();
    }

    /**
     * 获取本月开始日期
     *
     * @param pattern
     * @return
     */
    public static String monthStartDate(String pattern) {
        return new DateTime().dayOfMonth().withMinimumValue().toString(pattern);
    }

    /**
     * 获取本月开始日期
     *
     * @param pattern
     * @return
     */
    public static Date monthStartDate() {
        return new DateTime().dayOfMonth().withMinimumValue().toDate();
    }

    /**
     * 获取本月结束日期
     *
     * @param pattern
     * @return
     */
    public static String monthEndDate(String pattern) {
        return new DateTime().dayOfMonth().withMaximumValue().toString(pattern);
    }

    /**
     * 获取本月结束日期
     *
     * @return
     */
    public static Date monthEndDate() {
        return new DateTime().dayOfMonth().withMaximumValue().toDate();
    }

    /**
     * 格式化日期
     *
     * @param parseLong
     * @param format
     * @return
     */
    public static String formatDate(long parseLong, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(new Date(parseLong));
    }

    /**
     * 获取前几天的日期，带格式
     *
     * @param day
     * @param format
     * @return
     */
    public static String getBeforeDate(int day, String format) {
        DateTime time = new DateTime().plusDays(-day);
        return sdfDay.format(time.toDate());
    }

    /**
     * 计算时间差
     *
     * @param startTime
     * @param endTime
     * @param format
     * @return
     */
    public static long getTimeConsuming(String startTime, String endTime, String format) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
        long start = simpleDateFormat.parse(startTime).getTime();
        long end = simpleDateFormat.parse(endTime).getTime();
        long useTime = end - start;
        return useTime < 0 ? 0 : useTime;
    }

    /**
     * 计算年龄
     *
     * @param birthday yyyy-MM-dd
     * @return
     */
    public static int getAgeByBirthday(String birthday) {
        int age = 0;
        String[] days = getDay().split("-");
        String[] births = birthday.split("-");
        int year = Integer.parseInt(days[0]);
        int birthYear = Integer.parseInt(births[0]);
        int month = Integer.parseInt(days[1]);
        int birthMonth = Integer.parseInt(births[1]);
        int day = Integer.parseInt(days[2]);
        int birthDay = Integer.parseInt(births[2]);
        // 判断年龄是否相等
        if (year - birthYear > 0) {
            if (month - birthMonth > 0) {
                return year - birthYear;
            } else if (month - birthMonth == 0) {
                if (day - birthDay > 0) {
                    return year - birthYear;
                }
                return year - birthYear - 1;
            }
            return year - birthYear - 1;
        }
        return age;
    }

    /**
     * 获得上下午标识
     *
     * @return
     */
    public static String getAmPm() {
        DateTime dateTime = new DateTime();
        int hour = dateTime.getHourOfDay();
        if (hour < 13) {
            return AM;
        }
        return PM;
    }
}
