package com.ywt.mg.core.utils;

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

public class DateUtil {


    public static final String DADE_FROMAT_YMD = "yyyy-MM-dd";
    /**
     * 将时间戳转换成日期字符串格式
     *
     * @param timestamp 时间戳
     * @param pattern   日期格式
     * @return
     */
    public static String convertTimestampToDateString(long timestamp, String pattern) {
        Date date = new Date(timestamp);
        return convertToString(date, pattern);
    }

    public static String convertToString(Date date) {
        return convertToString(date, null);
    }

    public static String convertToString(Date date, String pattern) {
        if (StringHelper.isNullOrEmpty(pattern)) {
            pattern = "yyyy-MM-dd HH:mm:ss";
        }

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 计算当前时间和指定时间之间相差的小时
     *
     * @param smdate 指定的时间
     * @throws ParseException
     */
    public static int hourBetween(String smdate) {
        Date start = new Date();
        Date end = stringToDate(smdate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(start);
        long time1 = cal.getTimeInMillis();
        cal.setTime(end);
        long time2 = cal.getTimeInMillis();

        long between_days = (time2 - time1) / (1000 * 3600);

        return Integer.parseInt(String.valueOf(between_days));
    }

    /**
     * String转Date
     *
     * @param strDate
     * @return
     */
    public static Date stringToDate(String strDate, String pattern) {
        if (null == strDate) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            return sdf.parse(strDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Date stringToDate(String strDate) {
        return stringToDate(strDate, "yyyy-MM-dd HH:mm:ss");
    }


    /**
     * 根据两个查询时间得到日期差
     *
     * @param start 查询开始时间  格式:yyyy-MM-dd
     * @param end   查询结束时间  格式:yyyy-MM-dd
     * @return 相差天数（如果返回值为0，则表示查询的时间有误）
     */
    public int getValueBetweenTwoDate(String start, String end) throws Exception {
        int dayVaule = 0;
        // string --> date
        Date startDate = DateUtil.stringToDate(start);
        Date endDate = DateUtil.stringToDate(end);

        // date 转 long
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(startDate);
        Long startDay = startCalendar.getTimeInMillis();

        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(endDate);
        endCalendar.add(Calendar.DATE, 1);
        Long endDay = endCalendar.getTimeInMillis();

        // 单位毫秒
        Long value = endDay - startDay;
        dayVaule = (int) (value / 1000 / 3600 / 24);
        return dayVaule;
    }

    /**
     * 得到当月最后一天
     *
     * @param date 日期
     * @return 当月最后一天，格式：yyyy-MM-dd HH:mm:ss
     */
    public static Date getCurrentMonthLastDay(Date date) throws Exception {
        //获得实体类
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        //设置最后一天
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        //最后一天格式化
        return ca.getTime();
    }

    /**
     * 得到修改之后的日期
     * @param type:1-天，2-月，3-年
     * @param changeNumber : 往前或往后变动日期，changeNumber < 0 表示往前修改(eg:2019->2018) changeNumber 日/月/年，
     *                     changeNumber > 0 表示往后修改(eg:2018->2019</>) changeNumber 日/月/年，
     * @param date 日期
     * @return 修改之后的日期，格式：yyyy-MM-dd HH:mm:ss
     */
    public static Date getChangeMonthDate(Date date, int type, int changeNumber) throws Exception {
        //获得实体类
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        //设置最后一天
        if (type == 1){
            ca.add(Calendar.DAY_OF_YEAR, changeNumber);
        }else if(type == 2){
            ca.add(Calendar.MONTH, changeNumber);
        }else if (type == 3){
            ca.add(Calendar.YEAR, changeNumber);
        }
        //最后一天格式化
        return ca.getTime();
    }

    public static Date parseDate(String str, String pattern) {
        if (StringHelper.isNullOrWhiteSpace(str)) {
            return null;
        }

        if (StringHelper.isNullOrWhiteSpace(pattern)) {
            pattern = "yyyy-MM-dd HH:mm:ss";    //默认日期格式
        }

        SimpleDateFormat format = new SimpleDateFormat(pattern);
        try {
            format.setLenient(false);
            return format.parse(str);
        } catch (ParseException e) {
            return null;
        }
    }

    public static String getPastDate(int past) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String result = format.format(today);
        return result;
    }

    /**
     * 格式化日期
     *
     * @param date
     * @param pattern
     * @return
     */
    public static String formatDate(Date date, String pattern) {
        if (StringHelper.isNullOrEmpty(pattern)) {
            pattern = "yyyy-MM-dd HH:mm:ss";
        }

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 得到相对时间
     *
     * @param date 传入的时间
     * @param num  前几天，或者后几天
     * @return 改变之后的时间
     */
    public static Date getRelativeDate(Date date, int num) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        return calendar.getTime();
    }

    /**
     * 得到相对时间
     *
     * @param num 天数，大于0表示几天之后的时间，小于0表示几天之前的时间
     * @return 时间
     */
    public static Date getRelativeDate(int num) {
        return getRelativeDate(new Date(), num);
    }


}
