時間過濾和合併

2021-07-02 20:38:39 字數 4614 閱讀 6944

近期在做一項目的過程中,需要涉及到服務人員班次、請假及服務預定等一系列時間管理問題,最後要提供出人員空閒的時間段以供使用者選擇,歸結到底,涉及到兩大時間演算法,一是時間過濾,即在原定上班班次安排的基礎上扣除休假、請假以及已預定的時間段,另乙個是時間段合併,需要將乙個服務涉及的多位服務人員的有效時間合併,以便使用者先選擇時間,而後選擇該時間段有空的服務人員。下面將分享一下涉及時間的兩個演算法。

1、合併集合中的各時間段

原始資料:

starttime=2015-05-26 12:06:00    endtime=2015-05-26 15:06:00

starttime=2015-05-27 16:08:00    endtime=2015-05-27 19:08:00

starttime=2015-05-27 13:10:00    endtime=2015-05-27 16:10:00

starttime=2015-05-27 14:57:00    endtime=2015-05-27 17:57:00

starttime=2015-05-27 10:16:00    endtime=2015-05-27 13:16:00

starttime=2015-05-26 11:50:00    endtime=2015-05-26 13:50:00

starttime=2015-05-26 13:46:00    endtime=2015-05-26 16:46:00

starttime=2015-05-27 9:09:00    endtime=2015-05-27 12:09:00

starttime=2015-05-27 16:36:00    endtime=2015-05-27 18:36:00

starttime=2015-05-26 14:39:00    endtime=2015-05-26 16:39:00

結果:starttime=2015-05-26 11:50:00    endtime=2015-05-26 16:46:00

starttime=2015-05-27 9:09:00    endtime=2015-05-27 19:08:00

核心**

public static listmergedatetime(listemptydurations)

// 對原始資料進行排序

listem = emptydurations.orderby(p => p.starttime).tolist();

datetime starttime = em[0].starttime;

datetime endtime = em[0].endtime;

for (int i = 0; i < em.count - 1; i++)

);starttime = em[j].starttime;

endtime = em[j].endtime;

}else

}// 補上最後剩下的時間段

results.add(new emptyduration

);return results;

}

其它輔助測試**

public static void mergetest(int num, int days)

public static listgeneralduration(int count, int maxdatediff)

); }

return list;

}

2、時間段過濾

在此**中,左側是服務人員原定上班時間集合,右側是員工請假、預定所佔時間集合。

原始資料(左):

starttime=2015-05-26 9:00:00    endtime=2015-05-26 22:00:00

starttime=2015-05-27 9:00:00    endtime=2015-05-27 22:00:00

starttime=2015-05-28 9:00:00    endtime=2015-05-28 22:00:00

原始資料(右):

starttime=2015-05-27 19:39:00    endtime=2015-05-27 21:39:00

starttime=2015-05-28 12:56:00    endtime=2015-05-28 15:56:00

starttime=2015-05-26 17:17:00    endtime=2015-05-26 20:17:00

starttime=2015-05-27 9:45:00    endtime=2015-05-27 12:45:00

starttime=2015-05-27 18:08:00    endtime=2015-05-27 20:08:00

starttime=2015-05-28 19:46:00    endtime=2015-05-28 22:46:00

starttime=2015-05-28 12:09:00    endtime=2015-05-28 15:09:00

starttime=2015-05-27 11:55:00    endtime=2015-05-27 13:55:00

starttime=2015-05-28 17:18:00    endtime=2015-05-28 20:18:00

starttime=2015-05-26 18:09:00    endtime=2015-05-26 20:09:00

結果:starttime=2015-05-26 9:00:00    endtime=2015-05-26 17:17:00

starttime=2015-05-26 20:17:00    endtime=2015-05-26 22:00:00

starttime=2015-05-27 9:00:00    endtime=2015-05-27 9:45:00

starttime=2015-05-27 13:55:00    endtime=2015-05-27 18:08:00

starttime=2015-05-27 21:39:00    endtime=2015-05-27 22:00:00

starttime=2015-05-28 9:00:00    endtime=2015-05-28 12:09:00

starttime=2015-05-28 15:56:00    endtime=2015-05-28 17:18:00

核心**

public static listsubtractdatetime(listminuend, listsubtrahend)

if (subtrahend.count == 0)

// 對原始資料進行排序

listlefts = minuend.orderby(p => p.starttime).tolist();

listrights = subtrahend.orderby(p => p.starttime).tolist();

// 左右兩個集合的指標

int lindex = 0;

int rindex = 0;

// 左右兩個集合的元素數量

int lmax = lefts.count;

int rmax = rights.count;

datetime starttime = datetime.minvalue;

datetime endtime = datetime.minvalue;

// 左右指標是否要下移一位並獲取元素資料

bool lincrease = true;

while (lindex < lmax && rindex < rmax)

lincrease = false;

// 處理兩個集合當前元素存在交叉重疊的情況

if (endtime > rights[rindex].starttime && starttime < rights[rindex].endtime)

);// 上班結束時間在請假預定結束時間之前

if (endtime <= rights[rindex].endtime)

else

}else // 上班開始時間在請假預定時間之後

else}}

else

);lincrease = true;

}else

}if (lincrease)

}// 處理剩餘上班時間段

if (lindex < lmax)

);for (int i = lindex + 1; i < lmax; i++));}

}return results;

}

其它輔助測試**:

public static void subtracttest(int num, int days)

public static listgeneralduration(int days)

); }

return list;

}

迴圈和合併

loops語句允許我們多次執行乙個語句或一組語句。在less中,mixin可以自稱,與guard表示式和模式匹配組合使用時,這個遞迴mixin可以建立各種迭代 迴圈結構。loop count when count 0 box 輸出 css box 使用遞迴迴圈生成css網格類的一般示例 grids ...

SVN分支和合併

size small b color red 需要注意的是branch和trunk使用同一套版本號,也就是說無論在branch還是trunk的提交都會引起主版本號的增加。這是因為svn copy只支援同乙個repository內的檔案copy,並不支援跨repository的copy,所以新建立的b...

去重和合併

以前合併陣列用的concat,去重用的雙重迴圈比較後用splice刪除。最近發現es6的合併去重實在是省 合併陣列 新陣列 要合併的陣列1,要合併的陣列2 let arr3 arr1,arr2 陣列去重 新陣列 new set 要去重的陣列 let arr4 newset arr3 arr4 arr...