tx
2025-04-09 fa7510e1ed63df0366787fa4ed1b3db6426d2b46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace TProduct.Common
{
    public class WorkTimeHelper
    {
        private string _amWorkStartTime = "08:30";//上午工作开始时间
        private string _amWorkEndTime = "12:00";//上午工作结束时间
 
        private string _pmWorkStartTime = "13:30";//下午工作开始时间
        private string _pmWorkEndTime = "17:00";//下午工作结束时间
 
 
 
        private bool _isSundayRest = true;//周日是否休息
        private bool _isMondayRest = false;//周一是否休息
        private bool _isTuesdayRest = false;//周二是否休息
        private bool _isWednesdayRest = false;//周三是否休息
        private bool _isThursdayRest = false;//周四是否休息
        private bool _isFridayRest = false;//周五是否休息
        private bool _isSaturdayRest = true;//周六是否休息
        private bool _isOverTime = false;//是否考虑加班
 
 
 
        /// <summary>
        /// 上午工作开始时间
        /// </summary>
        public string AmWorkStartTime { get { return _amWorkStartTime; } set { _amWorkStartTime = value; } }
 
        /// <summary>
        /// 上午工作结束时间
        /// </summary>
        public string AmWorkEndTime { get { return _amWorkEndTime; } set { _amWorkEndTime = value; } }
 
        /// <summary>
        /// 下午工作开始时间
        /// </summary>
        public string PmWorkStartTime { get { return _pmWorkStartTime; } set { _pmWorkStartTime = value; } }
 
        /// <summary>
        /// 下午工作结束时间
        /// </summary>
        public string PmWorkEndTime { get { return _pmWorkEndTime; } set { _pmWorkEndTime = value; } }
 
        /// <summary>
        /// 周日是否休息
        /// </summary>
        public bool IsSundayRest { get { return _isSundayRest; } set { _isSundayRest = value; } }
        /// <summary>
        /// 周一是否休息
        /// </summary>
        public bool IsMondayRest { get { return _isMondayRest; } set { _isMondayRest = value; } }
        /// <summary>
        /// 周二是否休息
        /// </summary>
        public bool IsTuesdayRest { get { return _isTuesdayRest; } set { _isTuesdayRest = value; } }
        /// <summary>
        /// 周三是否休息
        /// </summary>
        public bool IsWednesdayRest { get { return _isWednesdayRest; } set { _isWednesdayRest = value; } }
        /// <summary>
        /// 周四是否休息
        /// </summary>
        public bool IsThursdayRest { get { return _isThursdayRest; } set { _isThursdayRest = value; } }
        /// <summary>
        /// 周五是否休息
        /// </summary>
        public bool IsFridayRest { get { return _isFridayRest; } set { _isFridayRest = value; } }
        /// <summary>
        /// 周六是否休息
        /// </summary>
        public bool IsSaturdayRest { get { return _isSaturdayRest; } set { _isSaturdayRest = value; } }
        /// <summary>
        /// 是否考虑加班
        /// </summary>
        public bool IsOverTime { get { return _isOverTime; } set { _isOverTime = value; } }
 
        /// <summary>
        /// 计算一共经过了多少时间
        /// </summary>
        /// <param name="StartTime"></param>
        /// <returns></returns>
        public static double CalcWorkHour(DateTime StartTime)
        {
            return new WorkTimeHelper().Calc(StartTime, DateTime.Now);
        }
        public static double CalcWorkHour(DateTime StartTime, DateTime EndTime)
        {
            return new WorkTimeHelper().Calc(StartTime, EndTime);
        }
 
        /// <summary>
        /// 计算超过的时间
        /// </summary>
        /// <param name="StartTime"></param>
        /// <returns></returns>
        public static double _miniOverTime = 4;
        public static double CalcOverHour(DateTime StartTime)
        {
            var t = new WorkTimeHelper().Calc(StartTime, DateTime.Now);
            if (t < _miniOverTime)
                return 0;
            else
                return Math.Round(t - 4, 2);
        }
        public static double CalcOverHour(DateTime StartTime, DateTime EndTime)
        {
            return new WorkTimeHelper().Calc(StartTime, EndTime);
        }
 
 
        /// <summary>
        /// 计算指定时间段内的工作时间--以小时计
        /// </summary>
        /// <returns></returns>
        public double Calc(DateTime StartTime, DateTime EndTime)
        {
            //如果结束时间小于等于开始时间,返回负数
            if (EndTime <= StartTime)
                return -1;
 
            //工作时间
            TimeSpan amWorkStart = DateTime.Parse(AmWorkStartTime).TimeOfDay;
            TimeSpan amWorkEnd = DateTime.Parse(AmWorkEndTime).TimeOfDay;
            TimeSpan pmWorkStart = DateTime.Parse(PmWorkStartTime).TimeOfDay;
            TimeSpan pmWorkEnd = DateTime.Parse(PmWorkEndTime).TimeOfDay;
 
            var startNow = StartTime.TimeOfDay;//开始时间的时间节点
            var endNow = EndTime.TimeOfDay;//结束时间的时间节点
            double minorHoursStart = 0;//开始当天的零散时间
            double minorHoursEnd = 0;//结束当天的零散时间
            double manyHours = 0;//集成时间
            double amWorkHours = amWorkEnd.Subtract(amWorkStart).TotalHours;//上午工作时间
            double pmWorkHours = pmWorkEnd.Subtract(pmWorkStart).TotalHours;//下午工作时间
            double workHours = amWorkHours + pmWorkHours;//一天的工作总时间
            var diffDays = Convert.ToDateTime(EndTime.ToShortDateString()).Subtract(Convert.ToDateTime(StartTime.ToShortDateString())).Days;//相差天数
 
            if (diffDays == 0)//表示开始和结束发生在同一天
            {
                if (this.IsOverTime)//考虑加班情况
                {
 
                    if (startNow < amWorkStart)
                    {
                        if (endNow < amWorkStart)
                            minorHoursStart = 0;
                        if (endNow >= amWorkStart && endNow <= amWorkEnd)
                            minorHoursStart = endNow.Subtract(amWorkStart).TotalHours;
                        else if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = amWorkHours;
                        else if (endNow >= pmWorkStart)
                            minorHoursStart = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours;
                    }
                    else if (startNow >= amWorkStart && startNow <= amWorkEnd)
                    {
                        if (endNow > amWorkStart && endNow <= amWorkEnd)
                            minorHoursStart = endNow.Subtract(startNow).TotalHours;
                        else if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours;
                        else if (endNow >= pmWorkStart)
                            minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + endNow.Subtract(pmWorkStart).TotalHours;
                    }
                    else if (startNow > amWorkEnd && startNow < pmWorkStart)
                    {
                        if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = 0;
                        else if (endNow >= pmWorkStart)
                            minorHoursStart = endNow.Subtract(pmWorkStart).TotalHours;
                    }
                    else if (startNow >= pmWorkStart)
                        minorHoursStart = endNow.Subtract(startNow).TotalHours;
 
                }
                else//不考虑加班情况
                {
 
                    if (startNow < amWorkStart)
                    {
                        if (endNow < amWorkStart)
                            minorHoursStart = 0;
                        if (endNow >= amWorkStart && endNow <= amWorkEnd)
                            minorHoursStart = endNow.Subtract(amWorkStart).TotalHours;
                        else if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = amWorkHours;
                        else if (endNow >= pmWorkStart && endNow <= pmWorkEnd)
                            minorHoursStart = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours;
                        else
                            minorHoursStart = workHours;
                    }
                    else if (startNow >= amWorkStart && startNow <= amWorkEnd)
                    {
                        if (endNow > amWorkStart && endNow <= amWorkEnd)
                            minorHoursStart = endNow.Subtract(startNow).TotalHours;
                        else if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours;
                        else if (endNow >= pmWorkStart && endNow <= pmWorkEnd)
                            minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + endNow.Subtract(pmWorkStart).TotalHours;
                        else
                            minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + pmWorkHours;
                    }
                    else if (startNow > amWorkEnd && startNow < pmWorkStart)
                    {
                        if (endNow > amWorkEnd && endNow < pmWorkStart)
                            minorHoursStart = 0;
                        else if (endNow >= pmWorkStart && endNow <= pmWorkEnd)
                            minorHoursStart = endNow.Subtract(pmWorkStart).TotalHours;
                        else
                            minorHoursStart = pmWorkHours;
                    }
                    else if (startNow >= pmWorkStart && startNow <= pmWorkEnd)
                    {
                        if (endNow <= pmWorkEnd)
                            minorHoursStart = endNow.Subtract(startNow).TotalHours;
                        else
                            minorHoursStart = pmWorkEnd.Subtract(startNow).TotalHours;
                    }
                    else
                        minorHoursStart = 0;
 
                }
 
            }
            else//开始和结束不再同一天
            {
                if (startNow < amWorkStart)
                    minorHoursStart = workHours;
                else if (startNow >= amWorkStart && startNow <= amWorkEnd)
                    minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + pmWorkHours;
                else if (startNow > amWorkEnd && startNow < pmWorkStart)
                    minorHoursStart = pmWorkHours;
                else if (startNow >= pmWorkStart && startNow <= pmWorkEnd)
                    minorHoursStart = pmWorkEnd.Subtract(startNow).TotalHours;
 
 
                if (IsOverTime)//考虑加班
                {
 
                    if (endNow < amWorkStart)
                        minorHoursEnd = 0;
                    else if (endNow >= amWorkStart && endNow <= amWorkEnd)
                        minorHoursEnd = endNow.Subtract(amWorkStart).TotalHours;
                    else if (endNow > amWorkEnd && endNow < pmWorkStart)
                        minorHoursEnd = amWorkHours;
                    else if (endNow >= pmWorkStart)
                        minorHoursEnd = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours;
                }
                else//不考虑加班
                {
                    if (endNow < amWorkStart)
                        minorHoursEnd = 0;
                    else if (endNow >= amWorkStart && endNow <= amWorkEnd)
                        minorHoursEnd = endNow.Subtract(amWorkStart).TotalHours;
                    else if (endNow > amWorkEnd && endNow < pmWorkStart)
                        minorHoursEnd = amWorkHours;
                    else if (endNow >= pmWorkStart && endNow <= pmWorkEnd)
                        minorHoursEnd = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours;
                    else
                        minorHoursEnd = workHours;
                }
 
                switch (StartTime.DayOfWeek)//判断开始当前是否休息
                {
                    case DayOfWeek.Sunday: if (IsSundayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Monday: if (IsMondayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Tuesday: if (IsTuesdayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Wednesday: if (IsWednesdayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Thursday: if (IsThursdayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Friday: if (IsFridayRest) minorHoursStart = 0; break;
                    case DayOfWeek.Saturday: if (IsSaturdayRest) minorHoursStart = 0; break;
                    default: break;
                }
 
                if (diffDays - 1 > 0)
                {
                    for (int i = 1; i < diffDays; i++)
                    {
                        switch (StartTime.AddDays(i).DayOfWeek)
                        {
                            case DayOfWeek.Sunday: if (!IsSundayRest) manyHours += workHours; break;
                            case DayOfWeek.Monday: if (!IsMondayRest) manyHours += workHours; break;
                            case DayOfWeek.Tuesday: if (!IsTuesdayRest) manyHours += workHours; break;
                            case DayOfWeek.Wednesday: if (!IsWednesdayRest) manyHours += workHours; break;
                            case DayOfWeek.Thursday: if (!IsThursdayRest) manyHours += workHours; break;
                            case DayOfWeek.Friday: if (!IsFridayRest) manyHours += workHours; break;
                            case DayOfWeek.Saturday: if (!IsSaturdayRest) manyHours += workHours; break;
                            default: break;
                        }
                    }
                }
 
 
            }
 
            return minorHoursStart + minorHoursEnd + manyHours;
 
 
 
        }
 
 
 
 
 
    }
}