วิธีนับวันหยุดระหว่าง 2 วัน C#

จะนับจำนวนวันหยุดจากฐานข้อมูลระหว่าง 2 วันได้อย่างไร

ฉันนับจำนวนวันทำการแล้ว แต่จะลบจำนวนวันหยุดที่นับระหว่าง 2 วันได้อย่างไร

สมมติว่าฉันมีตาราง Holidays ด้วย

  • วันฮาโลวีน 11-01
  • คริสต์มาส 12-25

วันที่:

  • วันที่เริ่มต้น = 10-25
  • วันที่สิ้นสุด = 01-30

คำตอบควรเป็น: วันทำการ - หมายเลขวันหยุดระหว่าง 2 วัน ;

นี่คือรหัสของฉัน:

 public static void GetBusinessDays(DateTime startD, DateTime endD)
 {
            double calcBusinessDays =
                1 + ((endD - startD).TotalDays * 5 -
                (startD.DayOfWeek - endD.DayOfWeek) * 2) / 7;

            if (endD.DayOfWeek == DayOfWeek.Saturday) calcBusinessDays--;
            if (startD.DayOfWeek == DayOfWeek.Sunday) calcBusinessDays--;

            MessageBox.Show(" " + calcBusinessDays);
        } 

จากลิงก์นี้ :คำนวณจำนวนวันทำการระหว่างสองวันทำการ วันที่?

ปุ่ม:

 private void button1_Click(object sender, EventArgs e)
        {
            GetBusinessDays(Convert.ToDateTime(metroDateTime1.Value.ToString("yyyy-MM-dd")), Convert.ToDateTime(metroDateTime2.Value.ToString("yyyy-MM-dd")));
        }

PS: ฉันยังใหม่กับ c#


person Kim Ivan Bay-an    schedule 30.09.2018    source แหล่งที่มา
comment
metroDateTime1.Value เป็นประเภท DateTime แล้ว   -  person Fabio    schedule 30.09.2018


คำตอบ (1)


ในขณะที่เท่านั้น

while (Start.Date <= End.Date) 
{ 
    if (Start.DayOfWeek == DayOfWeek.Saturday || Start.DayOfWeek == DayOfWeek.Sunday) 
        holidays++; 
    Start = Start.AddDays(1);
}

สามารถคำนวณจำนวนวันหยุดได้ แต่โค้ดด้านล่างนี้มีประสิทธิภาพมากกว่า เนื่องจากเราทราบแล้วว่าทุกๆ 7 วันมีวันหยุด 2 วันและไม่ต้องดำเนินการใดๆ เลย และการตรวจสอบเฉพาะ days % 7 (สูงสุด 6 วัน) สำหรับวันหยุดก็เพียงพอแล้ว .

int days = (int)(End - Start).TotalDays + 1;
        int holidays = days / 7 * 2;
        int remain = days % 7;
        DateTime dt = End.AddDays(-remain);
        while (dt.Date <= End.Date)
        {
            if (dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
                holidays++;
            dt = dt.AddDays(1);
        }
        int year = Start.Year;
        do
        {
            dt = new DateTime(year, 12, 25); //is chritsmass right?
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            dt = new DateTime(year, 7, 4); // 4th of july
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            dt = new DateTime(year, 10, 31); // holoween
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            year++;
        } while (year <= End.Year);
        int businessDays = days - holidays;

สาธิตสด

person Ashkan Mobayen Khiabani    schedule 30.09.2018
comment
DateTime.AddDays จะไม่อัปเดตอินสแตนซ์ที่มีอยู่ - จะคืนค่าใหม่ DateTime - person Fabio; 30.09.2018
comment
ขออภัย ฉันไม่เข้าใจสิ่งที่คุณหมายถึง - person Kim Ivan Bay-an; 30.09.2018
comment
@Fabio แย่จัง ฉันทำผิดพลาดไปแล้ว ขอบคุณที่กล่าวถึง - person Ashkan Mobayen Khiabani; 30.09.2018
comment
คำตอบ = ทำงาน - หมายเลขวันหยุดระหว่าง 2 วัน - person Kim Ivan Bay-an; 30.09.2018
comment
@ KimIvanBay-an เพื่อคำนวณวันหยุด เราสามารถวนซ้ำทุกวันและเพิ่มวันหยุดของเราได้หากวันเป็นวันเสาร์หรือวันอาทิตย์ อย่างไรก็ตามในสัปดาห์หนึ่งและฉันหมายถึง 7 วันต่อเนื่องต่อสัปดาห์ (ไม่ว่าจะเริ่มต้นที่ไหน) แน่นอนว่ามี 1 วันเสาร์และ 1 วันอาทิตย์ในนั้น ตัวอย่างเช่น ถ้าลบวันที่ 2 ออกเป็น 200 วัน เราจะได้ (200 / 7 = 28 สัปดาห์) และเท่ากับ 200 % 7 = 4 (เรามี 28 สัปดาห์ 4 วัน) ดังนั้น 2 วันหยุดต่อสัปดาห์ (28*2) และเราวนดู 4 วันที่ผ่านมาเพื่อดูว่าเป็นวันเสาร์หรือวันอาทิตย์หรือไม่ - person Ashkan Mobayen Khiabani; 30.09.2018
comment
@KimIvanBay-an และ int bussinessDays = days - holidays; จะให้วันทำการแก่เรา - person Ashkan Mobayen Khiabani; 30.09.2018
comment
ฉันเข้าใจว่าฉันหมายถึงวันหยุดก็เหมือนกับคริสต์มาส โฮโลวีนที่เก็บวันที่และเดือนในฐานข้อมูลของฉัน - person Kim Ivan Bay-an; 30.09.2018
comment
@ KimIvanBay-an ฉันเพิ่มโค้ดบางส่วนในคำตอบของฉันเพื่อครอบคลุมคริสต์มาส โฮโลวีน และ... โปรดตรวจสอบคำตอบ - person Ashkan Mobayen Khiabani; 30.09.2018
comment
ทำไมมันให้ฉัน -4 เมื่อฉันตั้งค่าเริ่มต้นเป็น 23 ธันวาคม สิ้นสุดที่ 26 ธันวาคม - person Kim Ivan Bay-an; 30.09.2018
comment
ฉันรันโค้ดในวันที่ 23 ธันวาคม และ 26 ธันวาคม และมีวันหยุด = 1 ปีที่คุณตั้งไว้ (ฉันใช้ปี 2018 สำหรับทั้งคู่) โดยวิธีการที่มีการพิมพ์ผิดในรหัสของฉันที่ฉันแก้ไขแล้ว - person Ashkan Mobayen Khiabani; 30.09.2018
comment
@ KimIvanBay-an ตรงกันข้าม แย่จัง แทนที่จะเป็น end - start ฉันทำ start - end ฉันแก้ไขแล้ว โปรดตรวจสอบ การสาธิตสด - person Ashkan Mobayen Khiabani; 30.09.2018
comment
มันใช้งานได้ แต่ฉันมีคำถามโง่ๆ ที่ดูเหมือนการให้อาหารด้วยช้อน แต่ฉันจะแก้ไขโค้ดนี้เพื่อรับวันที่วันหยุดจากวันหยุดบนโต๊ะของฉันซึ่งมีเดือนและวันที่อยู่ในนั้นได้อย่างไร - person Kim Ivan Bay-an; 30.09.2018
comment
ตารางของคุณมีรูปแบบอะไร? คุณมีเดือนและวันในช่องแยกหรือช่องวันที่เวลาหรือไม่? - person Ashkan Mobayen Khiabani; 30.09.2018
comment
ฟิลด์วันที่และเวลาในรูปแบบ MM-dd ฉันพบข้อผิดพลาดที่ฉันตั้งไว้ตั้งแต่ 31 ต.ค. ถึง 2 พ.ย. มันให้ 2 - person Kim Ivan Bay-an; 30.09.2018
comment
ภายใน do -while ที่ไปปีแล้วปีเล่า ให้ใส่ for อีกวงที่วนซ้ำช่วงวันหยุดของคุณจากตารางเช่น: do { foreach( DateTime x in YourDatesFromTable) { DateTime dt = new DateTime(year, x.Month,x.day); if (dt >= Start && dt <= End) holidays++;}} - person Ashkan Mobayen Khiabani; 30.09.2018
comment
31 ต.ค. ถึง 2 พ.ย. ให้วันหยุด 1 วัน 2 ธุรกิจ ถูกต้องครับ - person Ashkan Mobayen Khiabani; 30.09.2018
comment
ฉันแก้ไขคำตอบอีกครั้ง (เมื่อตรวจสอบวันหยุดของตารางเราควรหยุด ++ ถ้าวันที่ไม่ใช่วันเสาร์หรือวันอาทิตย์เหมือนกับว่าเป็นวันใดวันหนึ่งก็นับไปแล้ว - person Ashkan Mobayen Khiabani; 30.09.2018
comment
แต่เมื่อฉันตั้งค่าเป็น 29 ต.ค. ถึง 31 ต.ค. ให้ 1 และเมื่อฉันตั้งค่าเป็น 29 ต.ค. ถึง 1 พ.ย. ให้ 2 - person Kim Ivan Bay-an; 30.09.2018
comment
แล้วปีอธิกสุรทินล่ะ? - person Kim Ivan Bay-an; 30.09.2018