计算员工有效工作时间(C#版)

        /// <summary>
        /// 更具开始时间和结束时间获得有效的工作时间
        /// </summary>
        /// <param name="startime"></param>
        /// <param name="endtime"></param>
        /// <returns></returns>
        public static double GetWorkTime(string startime, string endtime)
        {
            if (startime == endtime)
            {
                return 0;
            }
            //计算结束时间和开始时间之间的时间差
            DateTime start = Convert.ToDateTime(startime);
            //结束时间
            DateTime end = string.IsNullOrEmpty(endtime) ? DateTime.Now : Convert.ToDateTime(endtime);
            //设置开始时间的标准工作时间
            DateTime startWorkSTime = Convert.ToDateTime(start.ToString("yyyy-MM-dd") + " " + "09:00:00");
            DateTime startWorkETime = Convert.ToDateTime(start.ToString("yyyy-MM-dd") + " " + "17:00:00");
            //设置结束时间的标准工作时间
            DateTime endWorkSTime = Convert.ToDateTime(end.ToString("yyyy-MM-dd") + " " + "09:00:00");
            DateTime endWorkETime = Convert.ToDateTime(end.ToString("yyyy-MM-dd") + " " + "17:00:00");

            TimeSpan ts = end - start;
            int day = ts.Days;
            double minute = 0.0;

            if (day > 0)
            {
                //当结束时间点钟比开始时间大天数减一
                if (DateTime.Compare(Convert.ToDateTime(start.ToString("HH:mm:ss")), Convert.ToDateTime(end.ToString("HH:mm:ss").ToString())) <= 0)
                {
                    day = day - 1;
                }
                DateTime xunhuan = start;
                minute = day * 8 * 60;
                for (int i = 0; i < day; i++)
                {
                    if (xunhuan.AddDays(1).DayOfWeek.ToString() == "Saturday" || xunhuan.AddDays(1).DayOfWeek.ToString() == "Sunday")
                    {
                        minute = minute - 8 * 60;
                    }
                    xunhuan = xunhuan.AddDays(1);
                }

            }
            //计算开始时间
            if (start.DayOfWeek.ToString() != "Saturday" && start.DayOfWeek.ToString() != "Sunday")
            {
                //计算开始时间落在九点之前
                if (DateTime.Compare(start, startWorkSTime) <= 0)
                {
                    minute += 8 * 60;
                }
                //计算时间落在上午九点和下午5点之间
                else if (DateTime.Compare(startWorkSTime, start) < 0 && DateTime.Compare(start, startWorkETime) <= 0)
                {
                    minute += (startWorkETime - start).TotalMinutes;
                }
            }
            //循环计算排除双休日

            if (end.DayOfWeek.ToString() != "Saturday" && end.DayOfWeek.ToString() != "Sunday")
            {
                //结束时间在九点和下午5点之间
                if (DateTime.Compare(endWorkSTime, end) < 0 && DateTime.Compare(end, endWorkETime) <= 0)
                {
                    minute += (end - endWorkSTime).TotalMinutes;
                }
                //结束时间在5点以后
                else if (DateTime.Compare(endWorkETime, end) <= 0)
                {
                    minute += 8 * 60;
                }
            }
            if (day == 0)
            {
                //不在同一天跨度时间不一致
                //|| ((start.ToString("yyyy-MM-dd") == end.ToString("yyyy-MM-dd")) && (DateTime.Compare(startWorkSTime, start) <= 0&& DateTime.Compare(start, startWorkETime) <= 0 && DateTime.Compare(start, end) <= 0&& DateTime.Compare(end, startWorkETime) < 0)))
                if (!(((start.ToString("yyyy-MM-dd") != end.ToString("yyyy-MM-dd")) && ((DateTime.Compare(startWorkSTime, start) <= 0 && DateTime.Compare(start, startWorkETime) <= 0) && (DateTime.Compare(endWorkSTime, end) <= 0 && DateTime.Compare(end, endWorkETime) <= 0)))))
                {
                    minute = (minute - 8 * 60) > 0 ? (minute - 8 * 60) : 0;
                }
            }
            return Math.Round(minute / 60, 1);
        }

思路:设置标准时间,比如,周末时间置为周五下午17:00或者周一9:00,每天时间在有效时间外的置为17:00或9:00

转载于:https://www.cnblogs.com/xue632777974/archive/2013/02/26/2933937.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中有多种方式进行时间计算,下面列举一些常用的方法: 1. 使用 DateTime 结构体进行时间计算 DateTime 结构体包含了许多时间计算的方法,如 AddDays、AddHours、AddMinutes、AddSeconds、AddMilliseconds 等方法,可以根据需要对时间进行加减操作。示例代码: ```csharp DateTime now = DateTime.Now; // 获取当前时间 DateTime nextWeek = now.AddDays(7); // 计算一周后的时间 TimeSpan duration = nextWeek - now; // 计算两个时间之间的差值 Console.WriteLine("一周后的时间为:" + nextWeek); Console.WriteLine("两个时间之间的差值为:" + duration.TotalDays + " 天"); ``` 2. 使用 TimeSpan 结构体进行时间计算 TimeSpan 结构体表示时间间隔,可以用来表示两个日期之间的时间差。示例代码: ```csharp DateTime start = new DateTime(2021, 1, 1); DateTime end = new DateTime(2021, 12, 31); TimeSpan duration = end - start; // 计算两个时间之间的差值 Console.WriteLine("2021年共有 " + duration.TotalDays + " 天"); ``` 3. 使用 DateTimeOffset 结构体进行时间计算 DateTimeOffset 结构体表示带有时区信息的时间,可以用来进行时间计算和跨时区处理。示例代码: ```csharp DateTimeOffset now = DateTimeOffset.Now; // 获取当前时间 DateTimeOffset nextHour = now.AddHours(1); // 计算一小时后的时间 TimeSpan duration = nextHour - now; // 计算两个时间之间的差值 Console.WriteLine("一小时后的时间为:" + nextHour); Console.WriteLine("两个时间之间的差值为:" + duration.TotalMinutes + " 分钟"); ``` 以上是三种常用的 C# 时间计算方法,根据需要选择合适的方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值