iT邦幫忙

1

C# 基礎上班時間計算

  • 分享至 

  • xImage

各位前輩好,我這邊在計算基礎上班時間
主要是想做一個請假的系統,但一開始在寫的時候覺得很正常
但寫著寫著覺得越寫越怪要判斷的東西好像越來越多
我就馬上跑去畫個邏輯圖出來發現好像要寫的東西有點多...
邏輯圖

目前是依照朝八晚五上班時間,中午12點休息1小時且暫時不計算國定假日為基礎開發
所以我變數主要分成
YYYY1,MM1,DD1,HH1
YYYY2,MM2,DD2,HH2
Work,Off_Work,Break
除此之外還針對跨年或非跨年的情況寫case來判斷要計算的天數以利計算時間
用餘數來判斷2月是否29天

void DayCheck(int YM1, int YM2, int YM3)
{
    switch (YM1)
    {
        case 0: MDay1 = 0; break;
        case 1: MDay1 = 31; break;
        case 2: MDay1 = 61; break;
        case 3: MDay1 = 92; break;
        case 4: MDay1 = 122; break;
        case 5: MDay1 = 153; break;
        case 6: MDay1 = 184; break;
        case 7: MDay1 = 214; break;
        case 8: MDay1 = 245; break;
        case 9: MDay1 = 275; break;
        case 10: MDay1 = 306; break;
        case 11: MDay1 = 334; if (Y1 % 4 == 0) { MDay1 += 1; } break;
        case 12: MDay1 = 365; if (Y1 % 4 == 0) { MDay1 += 1; } break;

    }
    switch (YM2)
    {
        case 0: MDay2 = 0; break;
        case 1: MDay2 = 31; break;
        case 2: MDay2 = 59; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 3: MDay2 = 90; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 4: MDay2 = 120; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 5: MDay2 = 151; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 6: MDay2 = 181; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 7: MDay2 = 212; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 8: MDay2 = 243; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 9: MDay2 = 273; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 10: MDay2 = 304; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 11: MDay2 = 334; if (Y2 % 4 == 0) { MDay2 += 1; } break;
        case 12: MDay2 = 365; if (Y2 % 4 == 0) { MDay2 += 1; } break;

    }
    switch (YM3)
    {
        case 0: MDay3 = 0; break;
        case 1: MDay3 = 31; break;
        case 2: MDay3 = 59; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 3: MDay3 = 90; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 4: MDay3 = 120; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 5: MDay3 = 151; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 6: MDay3 = 181; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 7: MDay3 = 212; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 8: MDay3 = 243; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 9: MDay3 = 273; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 10: MDay3 = 304; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 11: MDay3 = 334; if (Y2 % 4 == 0) { MDay3 += 1; } break;
        case 12: MDay3 = 365; if (Y2 % 4 == 0) { MDay3 += 1; } break;

    }
}

請問有沒有比較快速的方式可以達到計算日期的方式
還是我繼續寫下去比較實際一些?

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2022-08-23 20:35:32 檢舉
沒人這樣寫好嗎…C#不可能沒有時間物件,請善用…
邏輯不是這樣寫嗎?
這個是你要的嗎?
https://www.delftstack.com/zh-tw/howto/csharp/how-to-calculate-difference-between-two-dates-in-csharp/
欸...好像是的((
我沒想到可以先把日期計算出來後再做我的的轉換...
感謝
可以直接用回答的嗎,我可以幫你設定最佳答案
canrong iT邦新手 2 級 ‧ 2022-08-24 09:19:50 檢舉
工時系統 紀錄哪個日期上班幾小時 請假幾小時 加班幾小時 然後要算工時 直接sum 你想要的日期範圍的一般上班與加班幾小時不就好了 無論打卡的紀錄或者員工手動輸入 主要是有效工作時間的紀錄 以及請假時數的紀錄才對 我覺得啦...
CooperWu iT邦新手 3 級 ‧ 2022-08-24 13:25:18 檢舉
小提醒:你可以使用TaiwanCalendar物件的IsLeapYear(Int32)方法來判斷是否為閏年,單純 % 4的話會錯哦,因為100的倍數不是閏年,400的倍數又是閏年
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
allenlwh
iT邦高手 1 級 ‧ 2022-08-23 23:27:17

我之前寫過類似的判斷,我的步驟如下
1.建立一個行事曆table(一年365天,每天都要,用來記錄是否為上班日)
2.判斷請假當日是否為上班日(來源:行事曆table),是上班日,往(3)判斷;非上班日,請假時數=0
3.請假開始日的請假時數(是否請滿8小時),MAX=8(法定工時)
4.請假結束日的請假時數(是否請滿8小時),MAX=8(法定工時)
5.其餘請假日(扣除開始日及結束日),每日一定是8小時(法定工時)
6.(3)+(4)+(5)=請假時數

行事曆table的部份用二維陣列來做嗎
像是直接做[7,6]判斷
還是說有合適的套件

allenlwh iT邦高手 1 級 ‧ 2022-08-24 09:40:57 檢舉

我是直接寫成一個sql stored procedure,使用時直接呼叫,傳入開始日期時間、結束日期時間,計算後回傳時數

我要發表回答

立即登入回答