package com.example.springbootghw.util;

import lombok.extern.slf4j.Slf4j;

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

import static com.fasterxml.jackson.databind.util.ISO8601Utils.format;

@Slf4j
public class DateFormat {
    /**
     * 英文简写(默认)如:2010-12-01
     */
    public static String FORMAT_SHORT = "yyyy-MM-dd";
    /**
     * 英文全称  如:2010-12-01 23:15:06
     */
    public static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";
    /**
     * 精确到毫秒的完整时间    如:yyyy-MM-dd HH:mm:ss.S
     */
    public static String FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.S";
    /**
     * 中文简写  如:2010年12月01日
     */
    public static String FORMAT_SHORT_CN = "yyyy年MM月dd";
    /**
     * 中文全称  如:2010年12月01日  23时15分06秒
     */
    public static String FORMAT_LONG_CN = "yyyy年MM月dd日  HH时mm分ss秒";
    /**
     * 精确到毫秒的完整中文时间
     */
    public static String FORMAT_FULL_CN = "yyyy年MM月dd日  HH时mm分ss秒SSS毫秒";


//    public static void main(String[] args) {
//        System.out.println(getTimeString());
//        System.out.println("返回日期年份:"+getYear(new Date()));
//        System.out.println("返回月份:"+getMonth(new Date()));
//        System.out.println("返回当天日份"+getDay(new Date()));
//        System.out.println("返回当天小时"+getHour(new Date()));
//        System.out.println("返回当天分"+getMinute(new Date()));
//        System.out.println("返回当天秒"+getSecond(new Date()));
//        System.out.println("返回当天毫秒"+getMillis(new Date()));
//
//    }




    //字符串转化成对应的日期格式,字符串格式为yyyy-MM-dd HH:mm:ss

    public java.util.Date stringToDate(String source){

        SimpleDateFormat formatter = new SimpleDateFormat(FORMAT_LONG);
        try {
            java.util.Date date =  formatter.parse(source);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }


    }

    //时间戳转换为日期格式
    public java.util.Date timeToDate(long source){

        Date date = new Date(source);
        return date;



    }



    //计算两个日期的时间差值,返回单位分钟

    public long duration(java.util.Date source1, java.util.Date source2){
        long time1 = source1.getTime();
        long time2 = source2.getTime();
        long diff = Math.abs(time1-time2)/1000/60;
        return diff;

    }

    //日期增加amount天
    public java.util.Date addDay(java.util.Date source, int amount){
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(source);
        calendar.add(calendar.DATE,amount);//把日期往后增加amount天.整数往后推,负数往前移动
        java.util.Date dest =calendar.getTime();
        return dest;
    }

    //把日期往后增加amount时.整数往后推,负数往前移动
    public java.util.Date addHour(java.util.Date source, int amount){
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(source);
        calendar.add(calendar.HOUR,amount);
        java.util.Date dest =calendar.getTime();
        return dest;
    }

    //日期增加amount秒
    public java.util.Date addSecond(java.util.Date source, int amount){
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(source);
        calendar.add(calendar.SECOND,amount);//把日期往后增加amount天.整数往后推,负数往前移动
        java.util.Date dest =calendar.getTime();
        return dest;
    }

    /**
     *@param
     *@return 返回当前周一的日期对应的字符串 如:2019-07-08
     */
    public String firstDayOfWeek(){
        SimpleDateFormat simdf = new SimpleDateFormat(FORMAT_SHORT);

        Calendar cal = Calendar.getInstance();
        System.out.println("现在时间:"+simdf.format(cal.getTime()));

        cal.set(cal.DAY_OF_WEEK, cal.MONDAY);
        String firstDay = simdf.format(cal.getTime());
        log.info("当前时间所在周周一日期:"+firstDay);

        return  firstDay;


    }


    /**
     * 日期格式字符串转换成时间戳
     * @param timeStamp 时间戳 单位秒
     * @param format 如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public  String timeToString(long timeStamp,String format){
        SimpleDateFormat df = new SimpleDateFormat(format);
        return df.format(timeStamp*1000);

    }

    /**
     * 获取当前时间
     */
    public static String getTimeString(String format) {
        SimpleDateFormat df = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        return df.format(calendar.getTime());
    }

    /**
     * 获取日期年份
     * @param date 日期
     * @return
     */
    public static String getYear(Date date) {
        return format(date).substring(0, 4);
    }
    /**
     * 功能描述:返回月
     *
     * @param date
     *            Date 日期
     * @return 返回月份
     */
    public static int getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 功能描述:返回日期
     *
     * @param date
     *            Date 日期
     * @return 返回日份
     */
    public static int getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 功能描述:返回小时
     *
     * @param date
     *            日期
     * @return 返回小时
     */
    public static int getHour(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.HOUR_OF_DAY);
    }

    /**
     * 功能描述:返回分
     *
     * @param date
     *            日期
     * @return 返回分钟
     */
    public static int getMinute(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MINUTE);
    }

    /**
     * 返回秒钟
     *
     * @param date
     *            Date 日期
     * @return 返回秒钟
     */
    public static int getSecond(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.SECOND);
    }

    /**
     * 功能描述:返回毫
     *
     * @param date
     *            日期
     * @return 返回毫
     */
    public static long getMillis(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getTimeInMillis();
    }
}