java进修篇(一):处理节假日和工作日工具类

Calendar

Java中提供了Calendar这个专门用于对日期进行操作的类.

  • Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象.
Calendar rightNow = Calendar.getInstance();
  • Calendar类对YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法.
 - 年:calendar.get(Calendar.YEAR)
 - 月:calendar.get(Calendar.MONTH) + 1
 - 日:	calendar.get(Calendar.DAY_OF_MONTH)
 - 时:calendar.get(Calendar.HOUR)
 - 分:calendar.get(Calendar.MINUTE)
 - 秒: calendar.get(Calendar.SECOND)
 - 星期:calendar.get(Calendar.DAY_OF_WEEK)
 - 一年后的今天:calendar.add(Calendar.YEAR, 1)
 - 一个月的最后一天:calendar.set(calendar.get(Calendar.YEAR), currentMonth+1, 1),calendar.add(Calendar.DATE), calendar.get(Calendar.DAY_OF_MONTH)-1)
 - 设置日期:calendar.set(2008, 8, 8),calendar.set(Calendar.YEAR, 2000)

节假日和工作日

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
/**
 * 节假日工作时间处理
 * 假日只处理今年、去年的  1.1、5.1、10.1,和周末
 */
public class HolidayUtil {
 
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//日期格式化
    private static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static List<String> holidays = new ArrayList<String>(); //节假日列表
 
    /**
     * 静态块初始化法定节日
     */
    static {
    	//Calendar类对YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法
        Calendar c = Calendar.getInstance();  //日期处理类,通用对象,子类对象
        holidays.add(c.get(Calendar.YEAR)-1 + "-01-01"); 
        holidays.add(c.get(Calendar.YEAR)-1 + "-05-01"); 
        holidays.add(c.get(Calendar.YEAR)-1 + "-10-01"); 
        holidays.add(c.get(Calendar.YEAR) + "-01-01");
        holidays.add(c.get(Calendar.YEAR) + "-05-01");
        holidays.add(c.get(Calendar.YEAR) + "-10-01");
    }
 
    /**
     * 判断当天是否是节假日 节日只包含1.1;5.1;10.1
     *
     * @param date 时间
     * @return 非工作时间:true;工作时间:false
     */
    public static boolean isHolidayOrFestival(Date date) {
        boolean result = false;
        boolean isHolidayTmp = isHoliday(date);
        if (isHolidayTmp) {
            result = true;
        } else {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            //周末直接为非工作时间
            if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY || c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                result = true;
            } else {//周内9点到17:30为工作时间
                int hour = c.get(Calendar.HOUR_OF_DAY);
                int minute = c.get(Calendar.MINUTE);
                if (hour < 9 || (hour == 17 && minute > 30) || hour >= 18) {
                    result = true;
                }
            }
        }
        return result;
    }
 
    /**
     * 非工作时间获取最近的工作时间
     * @param date 时间
     * @return 返回处理后时间,格式:yyyy-MM-dd HH:mm:ss
     */
    public static String getPreWorkDay(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        if (!isHolidayOrFestival(date)) {
            return datechange(date, "yyyy-MM-dd HH:mm:ss");
        }
        //如果是周日最近的工作日为周五,日期减去2
        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            c.add(Calendar.DAY_OF_MONTH, -2);
        }
        //如果是周六最近的工作日为周五,日期减去1
        else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
            c.add(Calendar.DAY_OF_MONTH, -1);
        }
        //如果是周一,并且为早上9点之前,最近的工作日为周五,日期减去3
        else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
            int hour = c.get(Calendar.HOUR_OF_DAY);
            if (hour < 9) {
                c.add(Calendar.DAY_OF_MONTH, -3);
            }
        }else{
            int hour = c.get(Calendar.HOUR_OF_DAY);
            if (hour < 9) {
                c.add(Calendar.DAY_OF_MONTH, -1);
            }
        }
        c.set(Calendar.HOUR_OF_DAY, 17);
        c.set(Calendar.MINUTE, 30);
        c.set(Calendar.SECOND, 0);
        return datechange(c.getTime(), "yyyy-MM-dd HH:mm:ss");
    }
 
    public static String datechange(Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String demo = sdf.format(date);
        return demo;
    }
 
    /**
     * 根据判断当前时间是否是节日
     *
     * @param date
     *            时间
     * @return
     */
    private static boolean isHoliday(Date date) {
        boolean result = false;
        String dateStr = sdf.format(date);
        if (holidays.size() > 0) {
            for (String holiday : holidays) {
                if (holiday.equals(dateStr)) {
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
 
    public static void main(String[] args) throws ParseException {
        String d = "2017-07-20 18:31:58";
        System.out.println(getPreWorkDay(sdf1.parse(d)));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值