Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能只工作时间DateTime和Time Addition_C#_Datetime_Timespan - Fatal编程技术网

C# 我怎样才能只工作时间DateTime和Time Addition

C# 我怎样才能只工作时间DateTime和Time Addition,c#,datetime,timespan,C#,Datetime,Timespan,下面是我的代码。我想在显示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 well用户之间计算工作日和工作时间 我该怎么办 DateTime t1 = dateTimePicker1.Value.Date; DateTime t2 = dateTimePicker2.Value.Date; string s1 = textBo

下面是我的代码。我想在显示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 well用户之间计算工作日和工作时间

我该怎么办

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();

你可以假设这个范围内的任何一天,除了第一天和最后一天都是完整的工作日。所以你需要(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;
如果你能做到这一点(我是从内存中写的),那么我会将代码包装成一个方法,将结束日的小时数转换成一个方法,而不是重复它。

根据post,你可以更改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);
    }
通过这种方式,您可以使用开始日期和结束日期调用TimeInWorkingHours(…)函数,并提供您的第一个和最后一个工作时间

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

试试这个

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;
}
bool IsWorkingDay(DateTime dt)
{
int year=dt.year;
字典假日=新字典();
添加(新日期时间(年,1,1),空);
添加(新日期时间(年,1,6),空);
添加(新日期时间(年,4,25),空);
添加(新日期时间(年,5,1),空);
添加(新日期时间(年,6,2),空);
添加(新日期时间(年,8,15),空);
添加(新日期时间(年,11,1),空);
添加(新日期时间(年,12,8),空);
添加(新日期时间(年,12,25),空);
添加(新日期时间(年,12,26),空);
DateTime easterMonday=easterMonday(年)。添加天数(1);
如果(!holidays.ContainsKey(easterMonday))
假日。添加(easterMonday,空);
如果(!节假日日期)
如果(dt.DayOfWeek>DayOfWeek.Sunday和&dt.DayOfWeekTimeSpan.FromHours(13)和&dt1.TimeOfDayTimeSpan.FromHours(18))
dt1=新日期时间(dt1.Year,dt1.Month,dt1.Day,9,0,0).AddDays(1);
}
其他的
dt1=新日期时间(dt1.Year,dt1.Month,dt1.Day,9,0,0).AddDays(1);
//调整结束日期时间
如果(是工作日(dt2))
{
如果(dt2.TimeOfDayTimeSpan.FromHours(18))
dt2=新日期时间(dt2.Year,dt2.Month,dt2.Day,18,0,0);
否则如果(dt2.TimeOfDay>TimeSpan.FromHours(13)和&dt2.TimeOfDaydt1)
{
//将dt1向前移动到工作日的dt2日检查
而(dt1.DayOfYearTimeSpan.FromHours(14))
sdwt-=从小时开始的时间跨度(1);
如果(sdwt==时间跨度从小时(8))
天++;
其他的
{
小时=sdwt.小时;
分钟=sdwt.分钟;
}
}
//中间有一个停顿,因此如果间隔包括它,请进行调整
var totalminutes=(天*8*60+小时*60+分钟);
string res=string.Format(“{0}天{1}小时{2}分钟”,
天,
小时,
会议记录);
string totRes=string.Format(“{0}天{1}小时{2}分钟”,
总计分钟/8/60,
总计分钟/8,
总分钟);
返回res+“\r\n”+totRes;
}
试试这个

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);
        }
    }
private void GetPropertyFiceHours(参考日期时间日期)
{
int minHour=9,maxHour=17;
if(date.HourmaxHour)//如果晚于办公时间-转到第二天上午9点
{
date=date.AddDays(1)+新的时间跨度(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;
//假设firstDate和lastDate具有日期和时间
int[]weekendDays=新的int[2]{0,6};//星期日和星期六
GetPropertyFiceHours(参考firstDate);
GetPropertyFiceHours(参考最新日期);
while(weekendDays.Contains((int)firstDate.DayOfWeek))
{
//下一次约会
firstDate=firstDate.AddDays(1);
}
while(weekendDays.Contains((int)lastDate.DayOfWeek))
{
//获取上一个日期
lastDate=lastDate.AddDays(-1);
}
double hourDiff=Math.Abs(firstDate.Hour-lastDate.Hour)/8.0//8个办公时间
双日差=0;

while(firstDate.Date)你应该用正确的标记你的问题。在这种情况下,你忘了提到你的语言选择。我加了标记。你能帮我吗星期六和星期天怎么样?那些有效吗
//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;