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