package com.shmily.tjz.swap.Utils;

/**
 * Created by Shmily_Z on 2017/5/26.
 */

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

/**
 * 时间工具类
 * 所有跟时间相关的工具集合
 * @author Administrator
 *
 */
public class DateUtil {

    /**
     * 时间格式
     * @author Administrator
     *
     */
    public enum DateFormat{
        YYYY_MM_DD_HH_mm_ss("yyyy-MM-dd HH:mm:ss"),
        YYYY_MM_DD("yyyy-MM-dd"),
        YYYYMMDDHHMMSS("yyyyMMddHHmmss");

        private String value;
        DateFormat(String value){
            this.value = value;
        }

        public String getValue(){
            return this.value;
        }
    }
    /**
     * 当前时间
     * @param format
     * @return
     */
    public String getCurrentTime(DateFormat format){

        Date date = new Date();// 当前日期
        SimpleDateFormat sdf = new SimpleDateFormat(format.getValue());// 格式化对象
        return sdf.format(date);
    }

    /**
     * 格式化时间
     * @param format
     * @return
     */
    public String getFormatTime(String time, DateFormat format){

        SimpleDateFormat sdf = new SimpleDateFormat(format.getValue());// 格式化对象

        Date date = null;
        try {
            date = sdf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date!=null?sdf.format(date):time;
    }

    /**
     * 过去时间
     * @param time
     * @return
     */
    public boolean isPassedTime(String time){
        boolean result = false;
        SimpleDateFormat sdf = new SimpleDateFormat(DateFormat.YYYY_MM_DD_HH_mm_ss.getValue());
        try {

            Date date = sdf.parse(time);
            result = date.getTime() <= new Date().getTime();
        } catch (ParseException e) {

        }

        return result;
    }

    /**
     * 时间相减  开始时间 paramSystemTime 系统时间
     *
     * @return 时间相减工具方法 Second(秒)
     */
    public int timeSubtractionSecond(String paramSystemTime,String startTime) {
        int resultTime = 0;// 结果时间
        SimpleDateFormat sdf = new SimpleDateFormat(DateFormat.YYYY_MM_DD_HH_mm_ss.getValue());// 格式化对象
        Calendar calSystem = Calendar.getInstance();// 系统时间
        Calendar calStart = Calendar.getInstance();// 开始时间
        try {
            calSystem.setTime(sdf.parse(paramSystemTime));
            calStart.setTime(sdf.parse(startTime));
            long l=calStart.getTimeInMillis()-calSystem.getTimeInMillis();
            resultTime=new Long(l/1000).intValue();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return resultTime;
    }

    /**
     * 在日期上减去天数
     * @param date
     * @param dateFormat
     * @param numDay
     * @return
     */
    public String subDayOfMonth(String date, DateFormat dateFormat, int numDay){

        SimpleDateFormat df = new SimpleDateFormat(dateFormat.getValue());
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(df.parse(date));
            c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) - numDay);

            return df.format(c.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            System.err.print(e);
            return null;
        }
    }

    /**
     * 日期加上天数
     * @param date
     * @param dateFormat
     * @param numDay
     * @return
     */
    public String addDayOfMonth(String date, DateFormat dateFormat, int numDay){

        SimpleDateFormat df = new SimpleDateFormat(dateFormat.getValue());
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(df.parse(date));
            c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + numDay);

            return df.format(c.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            System.err.print(e);
            return null;
        }
    }

    /**
     * 在日期上减去秒
     * @param date
     * @param dateFormat
     * @return
     */
    public String subSecondOfDay(String date, DateFormat dateFormat, int second){

        SimpleDateFormat df = new SimpleDateFormat(dateFormat.getValue());
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(df.parse(date));
            c.set(Calendar.SECOND, c.get(Calendar.SECOND) - second);

            return df.format(c.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            System.err.print(e);
            return null;
        }
    }

    public String getDate(){
        //获得日期
        Calendar ca = Calendar.getInstance();
        String year = String.valueOf(ca.get(Calendar.YEAR));//获取年份
        String month = String.valueOf(ca.get(Calendar.MONTH)+1);//获取月份
        if(ca.get(Calendar.MONTH) < 10){
            month = "0" + month;
        }
        String day = String.valueOf(ca.get(Calendar.DATE));//获取日
        if(ca.get(Calendar.DATE) < 10){
            day = "0" + day;
        }
        String date = year + month + day;

        return date;
    }

    /**
     * 日期减月数
     * @param date
     * @param dateFormat
     * @param monthNum
     * @return
     */
    public String subMonth(String date, DateFormat dateFormat, int monthNum){

        SimpleDateFormat df = new SimpleDateFormat(dateFormat.getValue());
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(df.parse(date));
            c.set(Calendar.MONTH, c.get(Calendar.MONTH) - monthNum);

            return df.format(c.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            System.err.print(e);
            return null;
        }
    }

    /**
     * 两个日期之间相差的月数
     * @param startDate
     * @param endDate
     * @return
     */
    public int betweenDurations(String startDate, String endDate){

        int month = 0;
        int day = 0;

        SimpleDateFormat sdf = new SimpleDateFormat(DateFormat.YYYY_MM_DD.getValue());
        Calendar startCalendar = Calendar.getInstance();
        Calendar endCalendar = Calendar.getInstance();
        try {
            startCalendar.setTime(sdf.parse(startDate));
            endCalendar.setTime(sdf.parse(endDate));

            month = endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);
            day = endCalendar.get(Calendar.DAY_OF_MONTH) - startCalendar.get(Calendar.DAY_OF_MONTH);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("date format exception, start date " + startDate + ", end date " + endDate);
        }

        if(day > 0){
            month = month + 1;
        }

        return month;
    }

    /**
     * 时间相差天数
     * @param startTime
     * @param endTime
     * @return
     */
    public int betweenDays(String startTime,String endTime) {

        int seconds = timeSubtractionSecond(startTime, endTime);
        return seconds/60/60/24;
    }

}