package com.zhgd.xmgl.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;

/**
 * @program: wisdomSite
 * @description: 日期格式
 * @author: Mr.Peng
 * @create: 2020-12-15 17:05
 **/

public class DateUtil {

    /**
     * 时间格式化
     * @param oldDate
     * @return
     */
    public static String dealDateFormat(String oldDate) {
        Date date1 = null;
        SimpleDateFormat df2 = null;
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            Date date = df.parse(oldDate);
            Calendar beijingcal=Calendar.getInstance();
            beijingcal.setTime(date);
            //SimpleDateFormat df1 = new SimpleDateFormat ("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK);
            //date1 = df1.parse(date.toString());
            beijingcal.set(Calendar.HOUR, beijingcal.get(Calendar.HOUR) + 8);
            date1 = beijingcal.getTime();
            df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return df2.format(date1);
    }

    public static String parseDateFormat(String oldDate) {
        Date date = null;
        SimpleDateFormat df2 = null;
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            date = df.parse(oldDate);
            df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        } catch (ParseException e) {

            e.printStackTrace();
        }
        return df2.format(date);
    }

    public static String switchCreateTime(String createTime) {
        String formatStr2 = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");//注意格式化的表达式
        try {
            Date time = format.parse(createTime );
            String date = time.toString();
            //将西方形式的日期字符串转换成java.util.Date对象
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", java.util.Locale.US);
            Date datetime = (Date) sdf.parse(date);
            //再转换成自己想要显示的格式
            formatStr2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(datetime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return formatStr2;
    }

    /**
     * 查询本周所有天数
     * @return
     */
    public static List<String> getNowWeekAllDayList(){
        Calendar cal = Calendar.getInstance();
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return findDates(cal.getTime(),new Date());
    }

    /**
     * 查询现在时间几天前到现在之间的所有日期
     * @param days
     * @return
     */
    public static List<String> getOtherDayAllDayList(int days){
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE,-days);
        return findDates(cal.getTime(),new Date());
    }
    /**
     * 查询本月所有天数
     * @return
     */
    public static List<String> getNowMonthAllDayList(){
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return findDates(cal.getTime(),new Date());
    }

    /**
     * 获取两个时间段所有天数
     * @param beginTime
     * @param endTime
     * @return
     */
    public static List<String> getDiffTimeDayList(String beginTime,String endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return findDates(sdf.parse(beginTime),sdf.parse(endTime));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<String> findDates(Date dBegin, Date dEnd){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List lDate = new ArrayList();
        lDate.add(sdf.format(dBegin));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())){
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            if(calBegin.getTimeInMillis()<=dEnd.getTime()) {
                lDate.add(sdf.format(calBegin.getTime()));
            }
        }
        return lDate;
    }

    /**
     * 获取指定年份所有天数
     * @param yearMonth
     * @return
     */
    public static List<String> getYearAllMonthList(String yearMonth) {
        String year=yearMonth.substring(0,4);
        List<String> list=new ArrayList<>();
        for (int i = 1; i <=12 ; i++) {
            if(i<10){
                list.add(year+"0"+i);
            }else{
                list.add(year+i);
            }
        }
        return list;
    }

    /**
     *
     * @param yearMonth  月份格式yyyy-MM
     * @return
     */
    public static List<String> getMonthDayList(String yearMonth) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        //判断是否是当月
        if(yearMonth.equals(sdf.format(new Date()))){
            return getNowMonthAllDayList();
        }else{
            return getDayListOfMonth(yearMonth);
        }
    }
    public static List<String> getDayListOfMonth(String yearMonth) {
        int year = Integer.parseInt(yearMonth.split("-")[0]);  //年
        int month = Integer.parseInt(yearMonth.split("-")[1]); //月
        Calendar endCal = Calendar.getInstance();
        // 设置年份
        endCal.set(Calendar.YEAR, year);
        // 设置月份
        endCal.set(Calendar.MONTH, month - 1);
        // 获取某月最大天数
        int lastDay = endCal.getActualMaximum(Calendar.DATE);
        // 设置日历中月份的最大天数
        endCal.set(Calendar.DAY_OF_MONTH, lastDay);

        Calendar startCal = Calendar.getInstance();
        // 设置年份
        startCal.set(Calendar.YEAR, year);
        // 设置月份
        startCal.set(Calendar.MONTH, month - 1);
        //获取某月最小天数
        int firstDay = startCal.getActualMinimum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最小天数
        startCal.set(Calendar.DAY_OF_MONTH, firstDay);
        return findDates(startCal.getTime(),endCal.getTime());
    }

    /**
     * 获取当前周第一天日期
     * @return
     */
    public static String getNowWeekStartTime(){
        Calendar cal = Calendar.getInstance();
        // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }
    public static List<String> getDiffTimeYearList(String beginTime,String endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return findYear(sdf.parse(beginTime),sdf.parse(endTime));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static List<String> findYear(Date dBegin, Date dEnd){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        List lDate = new ArrayList();
        lDate.add(sdf.format(dBegin));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())){
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.YEAR, 1);
            if(calBegin.getTimeInMillis()<=dEnd.getTime()) {
                lDate.add(sdf.format(calBegin.getTime()));
            }
        }
        return lDate;
    }
    public static List<String> getDiffTimeMonthList(String beginTime,String endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return findMonth(sdf.parse(beginTime),sdf.parse(endTime));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static List<String> findMonth(Date dBegin, Date dEnd){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        List lDate = new ArrayList();
        lDate.add(sdf.format(dBegin));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())){
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.MONTH, 1);
            if(calBegin.getTimeInMillis()<=dEnd.getTime()) {
                lDate.add(sdf.format(calBegin.getTime()));
            }
        }
        return lDate;

    }

    public static List<String> getDiffTimeWeekList(String beginTime,String endTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startDate = LocalDate.parse(beginTime,formatter);
        LocalDate endDate = LocalDate.parse(endTime,formatter);
        List<String> lDate = new ArrayList();
        while (endDate.isAfter(startDate)){
            String start=startDate.format(formatter);
            if(startDate.getDayOfWeek()==DayOfWeek.SUNDAY) {
                lDate.add(start + "/" + start);
            }else{
                LocalDate sunday = startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
                if (sunday.isAfter(endDate)) {
                    lDate.add(start + "/" + endDate.format(formatter));
                } else {
                    lDate.add(start + "/" + sunday.format(formatter));
                }
            }
            startDate=startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).plusDays(1);

        }
        return lDate;
    }

    /**
     * 获取当前时间和当天时间几天前之间的所有天数
     * @param dayNum  当天时间以前具体几天
     * @return
     */
    public static List<String> getNowFewDaysAgoList(int dayNum){
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -dayNum);
            Date date = calendar.getTime();
            return findDates(date,new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }



    /**
     *
     * @param type 1 今日24 小时，2本周所有天，3本月所有天
     * @return
     */
    public static List<String> getDayList(Integer type) {
        if(type==1){
            List<String> list=new ArrayList<>();
            for(int i=0;i<=23;i++){
                list.add(i+"");
            }
            return list;
        }else if(type==2){
            return getNowWeekAllDayList();
        }else if(type==3){
            return getNowMonthAllDayList();
        }
        return null;
    }

    /**
     * 比较两个日期大小
     * @param time1
     * @param time2
     * @return
     * @throws ParseException
     */
    public static boolean compareTime(String time1,String time2){
        try {
            //如果想比较日期则写成"yyyy-MM-dd"就可以了
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            //将字符串形式的时间转化为Date类型的时间
            Date a=sdf.parse(time1);
            Date b=sdf.parse(time2);
            //Date类的一个方法，如果a早于b返回true，否则返回false
            //a时间下雨b时间返回true,否正返回false
            if(a.before(b)) {
                return true;
            }else {
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 查询当前时间指定天数之前的日期
     * @Title: getBeginDayTime
     * @Description: TODO(这里用一句话描述这个方法的作用)
     * @param @param days
     * @param @return    参数
     * @return String    返回类型
     * @throws
     */
    public static String getBeginDayTime(int days){
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE,-days);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(cal.getTime());
    }

    public static void main(String[] args) {
        //log.info(dealDateFormat("2021-08-25T04:22:20+0000"));
        System.out.println(getOtherDayAllDayList(10));
    }
}
