/**

* 获取当月的工作日(国家规定补班的无法分辨,仅限周末和国家规定节假日除外)

* @author xujinbo

*/

public class WorkDaysUtil {


   public static  List<Date> getWorkDates(int year, int month) {


       List<Date> dates = new ArrayList();


       Calendar cal = Calendar.getInstance();


       cal.set(Calendar.YEAR, year);


       cal.set(Calendar.MONTH, month - 1);


       cal.set(Calendar.DATE, 1);


       while (cal.get(Calendar.YEAR) == year &&


               cal.get(Calendar.MONTH) < month) {


           int day = cal.get(Calendar.DAY_OF_WEEK);


           if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) {

               Date clone = (Date)cal.getTime().clone();

               dates.add(clone);

           }


           cal.add(Calendar.DATE, 1);


       }

       return dates;


   }



   /**

    * 获取当前年

    * @return

    */

   public static int getYear(){

       Calendar calendar = Calendar.getInstance();

       int year = calendar.get(Calendar.YEAR);

       return year;

   }

   /**

    * 获取当前月

    * @return

    */

   public static int getMonth(){

       Calendar calendar = Calendar.getInstance();

       //记得要+1

       int month = calendar.get(Calendar.MONTH) + 1;

       return month;

   }



   /**

    * 改变date格式

    * @param list

    * @return

    */

   public static Set<String> makeDateToString(List<String> list){

       Set<String> set = new HashSet<>();

       for (String date:list){

           Date time = new Date(date);

           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

           String dateFormat = sdf.format(time);


           set.add(dateFormat);

       }

       return  set;

   }


   /**

    * Date 当日最大时间

    * @param date

    * @return

    */

   public  static  Date getDateMaxOrMin(Date date,String type){

       Calendar calendar = DateUtils.toCalendar(date);

       if("MAX".equals(type)) {

           calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));

           calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));

           calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));

           date = calendar.getTime();

       }

       else{

           calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMinimum(Calendar.HOUR_OF_DAY));

           calendar.set(Calendar.MINUTE, calendar.getActualMinimum(Calendar.MINUTE));

           calendar.set(Calendar.SECOND, calendar.getActualMinimum(Calendar.SECOND));

           date = calendar.getTime();

       }

       return date;

   }



   /**

    * Date转为LocalDate

    * @param date

    * @return

    */

   public static LocalDate dateTOLocalDate(Date date){

       LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

       return localDate;

   }


   //获取目标年份中目标月的第一天的开始时间

   public static Date getFirstDayOfMonth(String year,String month) {

       final Calendar cal = Calendar.getInstance();

       cal.set(Calendar.YEAR,Integer.parseInt(year));

       cal.set(Calendar.MONTH,Integer.parseInt(month)-1);

       cal.set(Calendar.HOUR_OF_DAY,0);

       cal.set(Calendar.MINUTE,0);

       cal.set(Calendar.SECOND,0);

       //获取目标月和目标年份的当月第一天时间

       final int start =Calendar.YEAR;

       cal.set(Calendar.DAY_OF_MONTH, start);

       return cal.getTime();

   }



   /**

    * 获得本月第一天

    * @return

    */

   public static String getMonthfirstDay(){

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

       Date date = new Date();

       Calendar calendar = new GregorianCalendar();

       calendar.setTime(date);


       calendar.add(Calendar.MONTH, 0);

       calendar.set(Calendar.DAY_OF_MONTH, 1);

       String firstDay = sdf.format(calendar.getTime());


       return firstDay;

   }


   /**

    * //获得本月最后一天

    * @return

    */

   public static String getMonthLastDay(){

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

       Date date = new Date();

       Calendar calendar = new GregorianCalendar();

       calendar.setTime(date);

       calendar.add(Calendar.MONTH, 0);

       calendar.set(Calendar.DAY_OF_MONTH, 1);

       calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

       String lastDay = sdf.format(calendar.getTime());


       return lastDay;

   }


}