package com.dhcc.finance.util;

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

import org.apache.commons.lang3.ArrayUtils;

import java.util.*;

import lombok.extern.slf4j.Slf4j;

/**
 * 功能描述：财务日期工具类
 * @author dml
 * @date 2019年4月25日 上午11:13:34
 * @修改日志：
 */
@Slf4j
public class FinanceDateUtil {
	/**
	 * 功能描述：计算指定格式时间字符串月份加减
	 * @param dateStr 时间字符串
	 * @param format 格式
	 * @param amount 加减数
	 * @return String
	 * @author dml
	 * @date 2019年4月25日 下午4:56:00
	 * @修改日志：
	 */
	public static String getLastMonth(String dateStr,String format,int amount){
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Date parse = null;
		try {
			parse = sdf.parse(dateStr);
		} catch (ParseException e) {
			log.error("转换出错>>",e);
			return null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(parse);
		calendar.add(Calendar.MONTH, amount);
		Date time = calendar.getTime();
		return sdf.format(time);
	}
	/**
	 * 功能描述：获取指定时间所在会计期间
	 * @param date 时间
	 * @return String
	 * @author dml
	 * @date 2019年5月22日 下午5:28:55
	 * @修改日志：
	 */
	public static String getPeriod(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		String format = sdf.format(date);
		return format;
	}
	/**
	 * 功能描述：获取指定日期所在会计期间
	 * @param date
	 * @param pattern
	 * @return String
	 * @author dml
	 * @date 2019年11月14日 下午3:38:28
	 * @修改日志：
	 */
	public static String getPeriodByDatestr(String date ,String pattern){
		try {
	    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		Date	parse = sdf.parse(date);
        String period = getPeriod(parse);
		return period;
		} catch (ParseException e) {
			log.error("日期转换失败>>>>>>>>",e);
		}
		return null;
	}
	/**
	 * 功能描述：获取当前会计期间的最后一天
	 * @param dateStr
	 * @return String
	 * @author dml
	 * @date 2019年7月28日 下午3:19:45
	 * @修改日志：
	 */
	public static String getMonthLastDay(String dateStr){
			Date monthLastDayDate = getMonthLastDayDate(dateStr);
			if (monthLastDayDate == null) {
				return null;
			}
			SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
			String format = sdf2.format(monthLastDayDate);
			return format;
	}
	/**
	 * 功能描述：获取当前会计期间的最后一天（DATE类型）
	 * @param dateStr
	 * @return Date
	 * @author dml
	 * @date 2019年10月22日 上午9:48:24
	 * @修改日志：
	 */
	public static Date getMonthLastDayDate(String dateStr){
		try {
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
	        Date parse = sdf.parse(dateStr);
			Calendar cal = Calendar.getInstance();
			cal.setTime(parse); 
			cal.set(Calendar.DATE, 1);
			cal.roll(Calendar.DATE, -1);
			Date time = cal.getTime(); 
			return time;
		} catch (ParseException e) {
			log.error("日期转换失败>>>>>>>>",e);
		}
		return null;
	}
	/**
	 * 功能描述：获取当前会计期间的第一天
	 * @param dateStr
	 * @return Date
	 * @author dml
	 * @date 2019年10月22日 上午9:48:24
	 * @修改日志：
	 */
	public static String getMonthFirstDayDate(String dateStr){
		try {
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
	        Date parse = sdf.parse(dateStr);
			Calendar cal = Calendar.getInstance();
			cal.setTime(parse); 
			cal.set(Calendar.DATE, 1);
			Date time = cal.getTime(); 
			SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
			String format = sdf2.format(time);
			return format;
		} catch (ParseException e) {
			log.error("日期转换失败>>>>>>>>",e);
		}
		return null;
	}
	/**
	 * 功能描述：获取当前会计期间的第一天（DATE类型）
	 * @param dateStr
	 * @return Date
	 * @author dml
	 * @date 2019年10月22日 上午9:48:24
	 * @修改日志：
	 */
	public static Date getMonthFirstDay(String dateStr){
		try {
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
	        Date parse = sdf.parse(dateStr);
			Calendar cal = Calendar.getInstance();
			cal.setTime(parse); 
			cal.set(Calendar.DATE, 1);
			Date time = cal.getTime(); 
			return time;
		} catch (ParseException e) {
			log.error("日期转换失败>>>>>>>>",e);
		}
		return null;
	}
	/**
	 * 功能描述:获取一个年月的数值
	 * @param date
	 * @return int
	 *@author likai
	 *@data 2020年4月15日下午5:44:49
	 *修改日志
	 */
	public static int getYearMonth(Date date){
        //传入日期
        Calendar calder = Calendar.getInstance();
        calder.setTime(date);//设置时间
        int year = calder.get(Calendar.YEAR);//获取年份
        int month=calder.get(Calendar.MONTH);//获取月份
        //返回年份乘以100加上月份的值，因为月份最多2位数，
        // 所以年份乘以100可以获取一个唯一的年月数值
        return year*100+month;
    }

    /**
     * 功能描述：获取某个日期的前一天或后一天，d为1时获取前一天，d为-1时获取后一天
     * @param time
     * @return String
     * @author likai
     * @date 2020年5月26日 下午2:25:50
     * @修改日志：
     */
	public static String getLastDay(String time,int d){
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	        Calendar calendar = Calendar.getInstance();
	        Date date=null;
	        try {
	            date = sdf.parse(time);
	        } catch (ParseException e) {
	            e.printStackTrace();
	        }
	        calendar.setTime(date);
	        int day=calendar.get(Calendar.DATE);
	        //                      此处修改为+1则是获取后一天
	        calendar.set(Calendar.DATE,day-d);
	 
	        String lastDay = sdf.format(calendar.getTime());
	        return lastDay;
	    }
	
	/**
	 * 功能描述：获取当前月份的下i个月份
	 * @param i
	 * @return String
	 * @author likai
	 * @date 2020年7月20日 下午3:25:16
	 * @修改日志：
	 */
	public static String getLast12Months(int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.MONTH, -i);
        Date m = c.getTime();
        return sdf.format(m);
    }
	
    	
}
