最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何計算兩個時間段內的工作日天數

 更新時間:2022年07月01日 08:36:41   作者:沉默木頭人  
這篇文章主要介紹了Java如何計算兩個時間段內的工作日天數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

計算兩個時間段內的工作日天數

一般在OA系統(tǒng)中都會遇到計算員工這段時間內的工作天數。

這種有兩種方式可以解決

  • 一是調用第三方服務接口進行計算
  • 二是自己在系統(tǒng)中寫代碼計算

一的好處就是每年的節(jié)假日不用自己去維護直接用兩個時間段就可以計算出來。但缺點是有些公司可以會和法定節(jié)假日期不一樣那么這時候就計算不了了,還有就是一般這種OA的系統(tǒng)自己內部使用的話可能會部署在內網上那么就訪問不了第三方接口了。

二需要自己維護節(jié)假日和計算。但有效的解決了方式一的缺陷;

根據方式二的特點介紹一個工具類,用來計算兩個時間段內的工作天數: 

import java.text.ParseException;
import java.util.*;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
public class CalcWorkDays {
    /**
     * 法定節(jié)假日列表
     *
     * @return
     */
    public static List<String> getHolidayList() {
        List<String> holidays = new ArrayList<>();
        // 元旦
        holidays.add("2021-01-01");
        holidays.add("2021-01-02");
        holidays.add("2021-01-03");
        // 春節(jié)
        holidays.add("2021-02-11");
        holidays.add("2021-02-12");
        holidays.add("2021-02-13");
        holidays.add("2021-02-14");
        holidays.add("2021-02-15");
        holidays.add("2021-02-16");
        holidays.add("2021-02-17");
        // 清明節(jié)
        holidays.add("2021-04-03");
        holidays.add("2021-04-04");
        holidays.add("2021-04-05");
        // 勞動節(jié)
        holidays.add("2021-05-01");
        holidays.add("2021-05-02");
        holidays.add("2021-05-03");
        holidays.add("2021-05-04");
        holidays.add("2021-05-05");
        // 端午節(jié)
        holidays.add("2021-06-12");
        holidays.add("2021-06-13");
        holidays.add("2021-06-14");
        // 中秋節(jié)
        holidays.add("2021-09-19");
        holidays.add("2021-09-20");
        holidays.add("2021-09-21");
        // 國慶節(jié)
        holidays.add("2021-10-01");
        holidays.add("2021-10-02");
        holidays.add("2021-10-03");
        holidays.add("2021-10-04");
        holidays.add("2021-10-05");
        holidays.add("2021-10-06");
        holidays.add("2021-10-07");
        return holidays;
    }
    /**
     * 需要上班的周末列表
     *
     * @return
     */
    public static List<String> getNeedWorkWeekends() {
        List<String> workWeekends = new ArrayList<>();
        workWeekends.add("2021-02-07");
        workWeekends.add("2021-02-20");
        workWeekends.add("2021-04-25");
        workWeekends.add("2021-05-08");
        workWeekends.add("2021-09-18");
        workWeekends.add("2021-09-26");
        workWeekends.add("2021-10-09");
        return workWeekends;
    }
    /**
     * 計算兩個日期之間的工作日天數,包含起始日期,包含終止日期
     *
     * @param start  計算開始時間  必須傳yyyy-MM-dd的格式
     * @param stop	計算結束時間  必須傳yyyy-MM-dd的格式
     * @return
     * @throws ParseException
     */
    public static int calc(String start, String stop) throws ParseException {
    	//獲取今年的法定節(jié)假日期
        List<String> workWeekends = getNeedWorkWeekends();
        //獲取今年需要補班的日期
        List<String> holidays = getHolidayList();
      
        String pattern = "yyyy-MM-dd";
        Date begin = DateUtils.parseDate(start, pattern);
        Date endTime = DateUtils.parseDate(stop, pattern);
        Calendar cEnd = new GregorianCalendar();
        cEnd.setTime(endTime);
        // 計算時算入stop當天
        cEnd.add(Calendar.DATE,1);
        Date end=cEnd.getTime();
        //
        Calendar c = Calendar.getInstance();
        c.setTime(begin);
        int count = 0;
        String ymd = null;
        while (c.getTime().before(end)) {
            ymd = DateFormatUtils.format(c.getTime(), pattern);
            // 不是法定節(jié)假日
            if (!holidays.contains(ymd)) {
                // 不是休息日
                if (workWeekends.contains(ymd)) {
                    count++;
                } else {
                    // 非周末
                    if (c.get(Calendar.DAY_OF_WEEK) != 1 && c.get(Calendar.DAY_OF_WEEK) != 7) {
                        count++;
                    }
                }
            }
            c.add(Calendar.DATE, 1);
        }
        return count;
    }
}

實現(xiàn)的大概原理就是

循環(huán)將該時間段的法定節(jié)假日排除 加上需要補班的日期得出最后該時間段間總共有多少個需要工作的天數。

以上兩部分的日期可維護在數據庫中,現(xiàn)測試方法目前放到代碼中了。

可以根據公司的制度進行調整需要工作的日期,比如在正常的工作日是休息可將該日期加到法定節(jié)假日中,在正常的休息日工作的話可將該日期添加到補班日期中。 

計算兩個日期之間的周末天數

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
/**
 * 計算兩個日期之間的周末天數
 * @author yan
 *
 */
public class WeekEnd {	
	public static void main(String[] args) throws ParseException {
		  // 設置傳入的時間格式  
	      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	      // 指定一個日期  
	      Date date1 = dateFormat.parse("2016-11-12 13:24:16");  
	      Date date2 = dateFormat.parse("2016-11-20 13:24:16");
	     //第三個三處代表是否 去除 雙休日
	      System.out.println(computeHolidays(date2,date1));			
	}
	
	public static int computeHolidays(Date t1,Date t2) throws ParseException{
		//初始化第一個日期
		Calendar cal1 = Calendar.getInstance();
		//初始化第二個日期,這里的天數可以隨便的設置
		Calendar cal2 = Calendar.getInstance(); 
 
		// 設置傳入的時間格式  
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		// 指定一個日期  
		Date date1 = dateFormat.parse(dateFormat.format(t1));  
		Date date2 = dateFormat.parse(dateFormat.format(t2));
		// 對 calendar 設置為 date 所定的日期  
		cal1.setTime(date1);  
		cal2.setTime(date2);
 
		int holidays = 0;
		//確定一個 大日期
		if(cal1.compareTo(cal2) > 0){
			Calendar temp = cal1;
			cal1 = cal2;
			cal2 = temp;
			temp = null;
		}
		while(cal1.compareTo(cal2)<=0){
			if(cal1.get(Calendar.DAY_OF_WEEK)==1||cal1.get(Calendar.DAY_OF_WEEK)==7){
				holidays++;
				System.out.println("周末:"+new SimpleDateFormat("yyyy-MM-dd").format(cal1.getTime()));
			}
			cal1.add(Calendar.DAY_OF_YEAR,1);
			
		}
		return holidays;
	}	
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中的ObjectOutputStream類使用

    Java中的ObjectOutputStream類使用

    ObjectOutputStream是Java.io包中的一個類,用于將Java對象的狀態(tài)信息序列化為字節(jié)流,序列化是將對象狀態(tài)轉換為字節(jié)流的過程,反序列化則是將字節(jié)流恢復為對象,本文介紹了ObjectOutputStream的原理、主要方法、使用步驟以及注意事項
    2024-09-09
  • 解決redisTemplate中l(wèi)eftPushAll隱性bug的問題

    解決redisTemplate中l(wèi)eftPushAll隱性bug的問題

    這篇文章主要介紹了解決redisTemplate中l(wèi)eftPushAll隱性bug的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java遍歷讀取整個redis數據庫實例

    java遍歷讀取整個redis數據庫實例

    這篇文章主要介紹了java遍歷讀取整個redis數據庫實例,使用支持正則表達式的key搜索方法jedis.keys(“*”)實現(xiàn),需要的朋友可以參考下
    2014-05-05
  • 在windows下揪出java程序占用cpu很高的線程并完美解決

    在windows下揪出java程序占用cpu很高的線程并完美解決

    這篇文章主要介紹了在windows下揪出java程序占用cpu很高的線程并完美解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java代理模式的深入了解

    Java代理模式的深入了解

    這篇文章主要為大家介紹了Java代理模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Docker 解決openjdk容器里無法使用JDK的jmap等命令問題

    Docker 解決openjdk容器里無法使用JDK的jmap等命令問題

    這篇文章主要介紹了Docker 解決openjdk容器里無法使用JDK的jmap等命令問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 解決@RequestBody部分屬性丟失的問題

    解決@RequestBody部分屬性丟失的問題

    這篇文章主要介紹了解決@RequestBody部分屬性丟失的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot中使用FastJson解決long類型在js中失去精度的問題

    springboot中使用FastJson解決long類型在js中失去精度的問題

    這篇文章主要介紹了springboot中使用FastJson解決long類型在js中失去精度的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 解決java頁面URL地址傳輸參數亂碼的方法

    解決java頁面URL地址傳輸參數亂碼的方法

    這篇文章主要介紹了解決java頁面URL地址傳輸參數亂碼的方法,URL地址參數亂碼問題,算是老話重談了吧!需要的朋友可以參考下
    2015-09-09
  • 淺談Java安全編碼之文件和共享目錄的安全性

    淺談Java安全編碼之文件和共享目錄的安全性

    Java程序是跨平臺的,可以運行在windows也可以運行在linux。但是平臺不同,平臺中的文件權限也是不同的。windows大家經常使用,并且是可視化的權限管理,這里就不多講了。本文主要講講linux下面的文件的權限和安全性問題,并且探討一下如何在java程序中考慮文件的安全性
    2021-06-06

最新評論

兰坪| 盈江县| 库车县| 攀枝花市| 新昌县| 恩平市| 新昌县| 安国市| 繁峙县| 剑河县| 恩平市| 宁河县| 石河子市| 奇台县| 蒙阴县| 灌南县| 织金县| 阳原县| 阳原县| 清河县| 新田县| 常熟市| 鄂州市| 时尚| 当阳市| 鹤庆县| 济源市| 榕江县| 合作市| 左权县| 大兴区| 花莲市| 新巴尔虎右旗| 张家界市| 星座| 正定县| 德惠市| 通渭县| 卢氏县| 平乡县| 靖安县|