public void DataTimeMath()
{
    if (drpHourStart.SelectedIndex == 0) drpMinuteStart.SelectedIndex = 1; //不可早於8點30,強制設定8點30為最早
    if (drpHourEnd.SelectedIndex == 0) drpMinuteEnd.SelectedIndex = 1; //不可早於8點30,強制設定8點30為最早
    if (txtDateStart.Text.Trim() == "") return; //沒有填寫日期不計算
    if (txtDateEnd.Text.Trim() == "") return; //沒有填寫日期不計算

    string strDate = "2000/01/01";
    string strDateStart = txtDateStart.Text; //使用者填入的日期
    string strDateEnd = txtDateEnd.Text; //使用者填入的日期
    string strTimeStart = drpHourStart.SelectedItem.Text + ":" + drpMinuteStart.SelectedItem.Text + ":00"; //使用者選擇的時間
    string strTimeEnd = drpHourEnd.SelectedItem.Text + ":" + drpMinuteEnd.SelectedItem.Text + ":00"; //使用者選擇的時間

    //上下班時間設定、午休時間設定
    TimeSpan 上班時間 = new TimeSpan(DateTime.Parse(strDate + " 08:30:00").Ticks);
    TimeSpan 下班時間 = new TimeSpan(DateTime.Parse(strDate + " 17:30:00").Ticks);
    TimeSpan 午休開始 = new TimeSpan(DateTime.Parse(strDate + " 12:00:00").Ticks);
    TimeSpan 午休結束 = new TimeSpan(DateTime.Parse(strDate + " 13:00:00").Ticks);

    TimeSpan t1 = new TimeSpan(DateTime.Parse(strDateStart + " " + strTimeStart).Ticks);
    TimeSpan t2 = new TimeSpan(DateTime.Parse(strDateEnd + " " + strTimeEnd).Ticks);
    double ts = t2.Subtract(t1).TotalHours;
    if (ts < 0) return; //起迄時間錯誤不計算

    TimeSpan date1 = new TimeSpan(DateTime.Parse(txtDateStart.Text).Ticks);
    TimeSpan date2 = new TimeSpan(DateTime.Parse(txtDateEnd.Text).Ticks);
    double dates = date2.Subtract(date1).TotalDays; //跨越天數

    double 請假時數 = 0;

    for (int i = 0; i <= dates; i++)
    {
        TimeSpan 請假開始 = new TimeSpan(DateTime.Parse(strDate + " " + strTimeStart).Ticks);
        Boolean 上午開始 = 午休開始.Subtract(請假開始).TotalHours >= 0 ? true : false;
        Boolean 下午開始 = 午休結束.Subtract(請假開始).TotalHours <= 0 ? true : false;
        TimeSpan 請假結束 = new TimeSpan(DateTime.Parse(strDate + " " + strTimeEnd).Ticks);
        Boolean 上午結束 = 午休開始.Subtract(請假結束).TotalHours >= 0 ? true : false;
        Boolean 下午結束 = 午休結束.Subtract(請假結束).TotalHours <= 0 ? true : false;

        if (i == 0 && i == dates) //同一天
        {
            //請上午,請下午
            if (上午開始 && 上午結束 || 下午開始 && 下午結束)
            {
                請假時數 += 請假結束.Subtract(請假開始).TotalHours;
            }
            else //請整天,跨越午休
            {
                if (上午開始) 請假時數 += 午休開始.Subtract(請假開始).TotalHours;
                if (下午結束) 請假時數 += 請假結束.Subtract(午休結束).TotalHours;
            }
        }
        else if (i == 0 && i < dates) //第一天
        {
            if (上午開始) 請假時數 += 午休開始.Subtract(請假開始).TotalHours + 4.5;
            if (下午開始) 請假時數 += 下班時間.Subtract(請假開始).TotalHours;
        }
        else if (i != 0 && i == dates) //最後一天
        {
            if (上午結束) 請假時數 += 請假結束.Subtract(上班時間).TotalHours;
            else 請假時數 += 3.5;

            if (下午結束) 請假時數 += 請假結束.Subtract(午休結束).TotalHours;
        }
        else
        {
            請假時數 += 8;
        }
    }
    txt總時數.Text = 請假時數.ToString();
    txt總天數.Text = (請假時數 / 8).ToString();
    //txt總天數.Text = Math.Floor(請假時數 / 8).ToString(); //無條件捨去
}

arrow
arrow
    文章標籤
    asp.net c#
    全站熱搜
    創作者介紹
    創作者 伊 的頭像

    伊のspace~芳香精油*美容保養*程式設計

    伊 發表在 痞客邦 留言(0) 人氣()