【问题标题】:How Can I Only Work Hours DateTime and Time Addition我怎样才能只工作时间日期时间和时间加法
【发布时间】:2015-06-10 11:54:16
【问题描述】:

下面是我的代码。我想在显示 2 天 2 小时后进行用户选择 10.06.2015 09:00 - 12.06.2015 13:00

但是当你10.06.2015 09:00 - 12.06.2015 13:00我只想显示 2.5 天时,我想在 09:00 - 18:00 之间进行工作日和工作时间。

我该怎么办?

DateTime t1 = dateTimePicker1.Value.Date;
DateTime t2 = dateTimePicker2.Value.Date;

string s1 = textBox9.Text;
string s2 = textBox10.Text;

DateTime dt1 = t1.AddMinutes(DateTime.Parse(s1).TimeOfDay.TotalMinutes);
DateTime dt2 = t2.AddMinutes(DateTime.Parse(s2).TimeOfDay.TotalMinutes);

var fark = dt2 - dt1;

    label1.Text =
String.Format("{0}{1}{2}",       
fark.Days > 0 ? string.Format("{0} gün", fark.Days) : "",
fark.Hours > 0 ? string.Format("{0} saat ", fark.Hours) : "",
fark.Minutes > 0 ? string.Format("{0} dakika ", fark.Minutes) : "").Trim();

【问题讨论】:

  • 您应该正确使用标记您的问题。在这种特殊情况下,您忘记提及您的语言选择。
  • 我添加了标签..你能帮帮我吗..
  • 周六和周日怎么样?那些工作日也是这样吗?
  • 还有法定节假日....
  • 对不起,我不能。我不知道 C#,但很快有人会帮助你。我只是在回顾你的问题..

标签: c# datetime timespan


【解决方案1】:

您可以假设该范围内的任何日子,除了第一天和最后一天都是完整的工作日。所以你需要 (AllDaysInRange -2) + HoursInfirstDay + HoursInLastDay。

TimeSpan ts = t2 - t1;
ts.Days = ts.Days - 2; //Allow for the 2 end days

int Day1Hours = t1.Hours - 9;//This removes any hours between 00.00 and 09.00
if (day1Hours > 9) //Then the user was working past 18.00
    ts.Days = ts.Days+1
else
    ts.Hours = ts.Hours + day1Hours;

int Day2Hours = t2.Hours - 9;//This removes any hours between 00.00 and 09.00
if (day2Hours > 9) //Then the user was working past 18.00
    ts.Days = ts.Days+1
else
    ts.Hours = ts.Hours + day2Hours;

如果你可以让它工作(我是从内存中写出来的),那么我会包装代码以将结束日的小时数转换为一个方法,而不是重复它。

【讨论】:

  • 但正如其他人所指出的,这不会考虑非工作日的天数。希望它能给你一个起点。 (另外,它需要一些错误检测,以防他们选择不到 2 天)
【解决方案2】:

根据DateTime Picker In WinForm How To Pick Time? 的帖子,您可以更改您的 DateTimePicker,使其与时间同步。

要限制用户可以选择的范围,您可以修改您的 ValueChanged 事件或为它编写自己的验证。 可能最简单的是:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
    {
        if (dateTimePicker1.Value.Hour < 10) // the 10 is just a random number, you can change it to your own limit
            dateTimePicker1.Value = this.dateTimePicker1.Value.AddHours(10 - dateTimePicker1.Value.Hour);
    }

要根据工作时间计算您的 2,5 天,我会编写一个函数来处理此责任,例如:

private int TimeInWorkingHours(DateTime start, DateTime end, int firstHour, int lastHour)
    {
        int days = Math.Min(end.Subtract(start).Days - 2, 0) ;
        int hoursInADay = lastHour - firstHour;

        int result = days * hoursInADay;

        result += start.Hour - firstHour;
        result += lastHour - end.Hour;

        return result;
    }

这样您可以使用您的开始日期和结束日期调用 TimeInWorkingHours(...) 函数,同时提供您的第一个和最后一个工作时间。

首先计算工作日,然后添加边界小时数。这样你就可以得到你的工作时间,然后你可以除以工作时间来得到你的工作日。

【讨论】:

  • 此解决方案不排除周日、周六或节假日。如果你也想这样做,你应该实现一个像 IsHoliday(DateTime day){...} 这样的函数,并减少非工作日的总天数。
【解决方案3】:

试试这个

private void GetProperOfficeHours(ref DateTime date)
    {
        int minHour = 9, maxHour = 17;

        if (date.Hour < minHour) //if earlier than office hours - start from 9am
        {
            date = date + new TimeSpan(9, 0, 0);
        }
        else if (date.Hour > maxHour) //if later than office hours - go to next day 9am
        {
            date = date.AddDays(1) + new TimeSpan(9, 0, 0);
        }
    }

然后……

//assuming firstDate & lastDate have date and time
        int[] weekendDays = new int[2] { 0, 6 }; // Sunday and Saturday

        GetProperOfficeHours(ref firstDate);
        GetProperOfficeHours(ref lastDate);

        while (weekendDays.Contains((int)firstDate.DayOfWeek))
        {
            //get next date
            firstDate = firstDate.AddDays(1);
        }

        while (weekendDays.Contains((int)lastDate.DayOfWeek))
        {
            //get prev date
            lastDate = lastDate.AddDays(-1);
        }

        double hourDiff = Math.Abs(firstDate.Hour - lastDate.Hour) / 8.0; //8 office hours
        double dayDifference = 0;
        while (firstDate.Date <= lastDate.Date) //Loop and skip weekends
        {
            if (!weekendDays.Contains((int)firstDate.DayOfWeek)) //can also check for holidays here
                dayDifference++;

            firstDate = firstDate.AddDays(1);
        }

        dayDifference = dayDifference + hourDiff;

可能需要一些调整,希望对您有所帮助。

【讨论】:

    【解决方案4】:

    试试这个

    bool IsWorkingDay(DateTime dt)
    {
        int year = dt.Year;
        Dictionary<DateTime, object> holidays = new Dictionary<DateTime, object>();
        holidays.Add(new DateTime(year, 1, 1), null);
        holidays.Add(new DateTime(year, 1, 6), null);
        holidays.Add(new DateTime(year, 4, 25), null);
        holidays.Add(new DateTime(year, 5, 1), null);
        holidays.Add(new DateTime(year, 6, 2), null);
        holidays.Add(new DateTime(year, 8, 15), null);
        holidays.Add(new DateTime(year, 11, 1), null);
        holidays.Add(new DateTime(year, 12, 8), null);
        holidays.Add(new DateTime(year, 12, 25), null);
        holidays.Add(new DateTime(year, 12, 26), null);
        DateTime easterMonday = EasterSunday(year).AddDays(1);
        if (!holidays.ContainsKey(easterMonday))
            holidays.Add(easterMonday, null);
    
        if (!holidays.ContainsKey(dt.Date))
            if (dt.DayOfWeek > DayOfWeek.Sunday && dt.DayOfWeek < DayOfWeek.Saturday)
                return true;
    
        return false;
    }
    
    string WorkingTime(DateTime dt1, DateTime dt2)
    {
        // Adjust begin datetime
        if (IsWorkingDay(dt1))
        {
            if (dt1.TimeOfDay < TimeSpan.FromHours(9))
                dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0);
            else if (dt1.TimeOfDay > TimeSpan.FromHours(13) && dt1.TimeOfDay < TimeSpan.FromHours(14))
                dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 14, 0, 0);
            else if (dt1.TimeOfDay > TimeSpan.FromHours(18))
                dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0).AddDays(1);
        }
        else
            dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0).AddDays(1);
    
        // Adjust end datetime
        if (IsWorkingDay(dt2))
        {
            if (dt2.TimeOfDay < TimeSpan.FromHours(9))
                dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0).AddDays(-1);
            else if (dt2.TimeOfDay > TimeSpan.FromHours(18))
                dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0);
            else if (dt2.TimeOfDay > TimeSpan.FromHours(13) && dt2.TimeOfDay < TimeSpan.FromHours(14))
                dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 13, 0, 0);
        }
        else
            dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0).AddDays(-1);
    
        double days = 0;
        double hours = 0;
        double minutes = 0;
    
        if (dt2 > dt1)
        {
            // Move dt1 forward to reach dt2 day chacking for working days
            while (dt1.DayOfYear < dt2.DayOfYear)
            {
                if (IsWorkingDay(dt1))
                    days++;
                dt1 = dt1.AddDays(1);
            }
    
            // Now get the worked hours as if were on the same day in the same manner
            TimeSpan sdwt = dt2 - dt1;
            if (dt1.TimeOfDay < TimeSpan.FromHours(13) && dt2.TimeOfDay > TimeSpan.FromHours(14))
                sdwt -= TimeSpan.FromHours(1);
            if (sdwt == TimeSpan.FromHours(8))
                days++;
            else
            {
                hours = sdwt.Hours;
                minutes = sdwt.Minutes;
            }
        }
    
        // There is a pause in between so adjust if the interval include it
    
        var totalminutes = (days * 8 * 60 + hours * 60 + minutes);
    
        string res = String.Format("{0} days {1} hours {2} minutes",
            days,
            hours,
            minutes);
        string totRes = String.Format("{0} days {1} hours {2} minutes",
            totalminutes / 8 / 60,
            totalminutes / 8,
            totalminutes);
    
        return res + "\r\n" + totRes;
    }
    

    【讨论】:

    • 谢谢。但我想做工作日。还有一个问题。当 .I 选择 11.6.2015 9:00 - 13.06.2015 13:00 = 只有总小时数和工作时间..
    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多