import com.mysql.jdbc.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * 时间处理类
 * <p>Version: 1.0
 */
public class DateHelper {

    private static Logger logger = LoggerFactory.getLogger(DateHelper.class);
    
    public static final String getCurrentDate(String pattern) {
        SimpleDateFormat df = new SimpleDateFormat(pattern , Locale.CHINA);
        return df.format(new Date());
    }
    
    /**
     * 获取满格式日期
     * @param dateString
     * @return
     */
    public static final Date getFullFormatDate(String dateString) {
       
      return getFormatDate(dateString, "yyyy-MM-dd HH:mm:ss");
    }
    
    /**
     * 获取指定日期格式的日期
     * @param dateString
     * @return
     */
    public static final Date getFormatDate(String dateString, String format) {
       SimpleDateFormat sdf = new SimpleDateFormat(format , Locale.CHINA);
       Date returnDate;
      try {
         returnDate = sdf.parse(dateString);
      } catch (ParseException e) {
          String errMsg = "日期字符串" + dateString + "解析异常";
          logger.error(errMsg, e);
          throw new RuntimeException(errMsg, e);
      }
      return returnDate;
    }    
    public static final String getFormatString(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format , Locale.CHINA);
        return sdf.format(date);
    }
    public static final String getFormatString(String dateString, String format) {
        if ( StringUtils.isNullOrEmpty( dateString )) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format , Locale.CHINA);
        Date returnDate;
        String returnString;
        try {
            returnDate = sdf.parse(dateString);
        } catch (ParseException e) {
            String errMsg = "日期字符串" + dateString + "解析异常";
            logger.error(errMsg, e);
            throw new RuntimeException(errMsg, e);
        }
        returnString=sdf.format(returnDate);
        return returnString;
    } 
    
    /**
     * 求两个日期之间相差天数   不足一天算一天
     * @Title: getTwoDay 
     * @return long    返回类型
     * @throws
     */
    public static final int getTwoDay(Date StartDate, Date endDate){
       if(endDate.getTime()>=StartDate.getTime()){
          int day = (int)((endDate.getTime() - StartDate.getTime()) / (24 * 60 * 60 * 1000));
          if((endDate.getTime() - StartDate.getTime()) % (24 * 60 * 60 * 1000)!=0)
              day+=1;
          return day;
       }else{
          return -1;
       }
    }
    /**
     * 计算时间差  精确到分
     * <p>User: fengmingyue
     * <p>Date: 2017年5月5日 下午8:38:35
     * <p>Version: 1.0
     * @param StartDate
     * @param endDate
     * @return
     */
   public static String getTime(Date StartDate, Date endDate) {
       long diff = endDate.getTime() - StartDate.getTime();
       long days = diff / (1000 * 60 * 60 * 24);
       long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
       long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
       return days+"天"+hours+"小时"+minutes+"分";
   }
   
    /**
     * 计算时间差  精确到分
     * @return
     */
    public static String getTimeStr (long diff ) {
        long days = diff / ( 1000 * 60 * 60 * 24 );
        long hours = ( diff - days * ( 1000 * 60 * 60 * 24 ) ) / ( 1000 * 60 * 60 );
        long minutes = ( diff - days * ( 1000 * 60 * 60 * 24 ) - hours * ( 1000 * 60 * 60 ) ) / ( 1000 * 60 );
        return days + "天" + hours + "小时" + minutes + "分钟";
    }
   /**
    * 比较两个日期大小  当date1大于date2 时返回true
    * @Title: compareTwoDate 
    * @Description: 比较两个日期大小  当date1大于date2 时返回true
    * @return boolean    返回类型
    */
   public static boolean compareTwoDate(Date date1, Date date2){
      boolean flag = false;
        try {
            if (date1.getTime() > date2.getTime()) {
               flag = true;
            } else if (date1.getTime() < date2.getTime()) {
               flag = false;
            } else {
               flag = true;
            }
        } catch (Exception e) {
            logger.error("日期比较过程错误:" + e.getMessage(),e);
        }
      return flag;
   }
   
   /**
    * 
   * @Title: getTimeSecond 
   * @Description: (时间差) 
   * @param @param reportDate
   * @param @param contrastDate
   * @param @return    设定文件 
   * @return Map    返回类型 
   * @throws
    */
   public  static  String[]  getTimeSecond(Date reportDate, Date contrastDate){
      try {
           long diff = contrastDate.getTime() - reportDate.getTime();
           long day = diff / (24 * 60 * 60 * 1000);
           long hour = (diff / (60 * 60 * 1000) - day * 24);
           long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
           long s = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
           String[] time = {String.valueOf(day), String.valueOf(hour), String.valueOf(min), String.valueOf(s)};
           return time;

      } catch (Exception e) {
         logger.error(e.getMessage(), e);
         return new String[]{"0","0","0","0"};
      }
   }
   
   /**
    * 
   * @Title: getDate 
   * @Description: (根据样式返回当时date数据格式) 
   * @return String    返回类型 
   * @throws
    */
   public static String getDate(Object currdate, String foramte) {
      if (null == currdate) {
         return "";
      }
      SimpleDateFormat date = new SimpleDateFormat(foramte);
      return date.format(currdate);
   }
   
   /**
    * <p>Desc:获得指定日期的前一天的日期 
    * @param date 指定日期
    * @return
    */
   public static String getLastDayDate(Date date){
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar calendar = Calendar.getInstance(); //得到日历
      calendar.setTime(date);//把指定时间赋给日历
      calendar.add(Calendar.DATE, -1);  //设置为前一天
      Date dBefore = calendar.getTime();   //得到前一天的时间
      return sdf.format(dBefore);
   }
   
   /**
    * <p>Desc:获得指定日期的前一个月的日期 
    * @param date 指定日期
    * @return
    */
   public static String getLastMonthDate(Date date){
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar calendar = Calendar.getInstance(); //得到日历
      calendar.setTime(date);//把指定时间赋给日历
      calendar.add(Calendar.MONTH, -1);  //设置为前一个月
      Date dBefore = calendar.getTime();   //得到前一个月
      return sdf.format(dBefore);
   }
   
   /**
    * 根据生日计算年龄
    * @Title getAgeByBirth
    * @param birthday
    * @return 
    * @since V1.0
    */
   public static int getAgeByBirth(Date birthday) {
        int age = 0;
        try {
            Calendar now = Calendar.getInstance();
            now.setTime(new Date());// 当前时间

            Calendar birth = Calendar.getInstance();
            birth.setTime(birthday);

            if (birth.after(now)) {//如果传入的时间,在当前时间的后面,返回0岁
                age = 0;
            } else {
                age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
                if (now.get(Calendar.DAY_OF_YEAR) > birth.get(Calendar.DAY_OF_YEAR)) {
                    age += 1;
                }
            }
            return age;
        } catch (Exception e) {//兼容性更强,异常后返回数据
           return 0;
        }
    }
   
   /**
    * 
    * @Title getNowNextTomorrowSeconds
    * @Description 获取当前时间距离第二天零时多少秒数
    * @return
    */
   public static long getNowNextTomorrowSeconds(){
       Calendar cal = Calendar.getInstance ();
       cal.add ( Calendar.DAY_OF_YEAR, 1 );
       cal.set ( Calendar.HOUR_OF_DAY, 0 );
       cal.set ( Calendar.MINUTE, 0 );
       cal.set ( Calendar.SECOND, 0 );
       cal.set ( Calendar.MILLISECOND, 0 );
       return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
   }

   /**
    * @Param [根据时间戳(精确到毫秒)转换时间]
    * @return java.util.Date
    **/
   public static final Date getFormatDateStamp(String dateString, String format) {
      SimpleDateFormat sdf = new SimpleDateFormat(format , Locale.CHINA);
      Date returnDate;
      try {
         long dateLong = Long.parseLong(dateString);
         String ft = sdf.format(dateLong);
         returnDate = sdf.parse(ft);
      } catch (ParseException e) {
         String errMsg = "日期字符串" + dateString + "解析异常";
         logger.error(errMsg, e);
         throw new RuntimeException(errMsg, e);
      }
      return returnDate;
   }
}