【发布时间】:2017-05-02 17:11:39
【问题描述】:
我并没有真正的技术问题,更多的是我已经绞尽脑汁好几个小时来寻找解决某个问题的方法。我不敢相信我是第一个解决这个问题的人,但是谷歌让我一个人呆着。那么,可能有人以前这样做过。
这就是问题所在:假设在夜间工作的员工会获得一定的工资附加费。根据定义,“夜间时间”从 23:00 到 06:00(晚上 11 点到早上 6 点)。我如何计算某个工作时间段中有多少是夜间时间。对于人脑来说非常简单,但我无法弄清楚逻辑。让我举几个例子:
工作时间:22:00 - 8:00 = 夜间 7 小时,正常 3 小时
工作时间:23:00 - 5:00 = 6 小时夜间,0 小时正常
工作时间:20:00 - 4:00 = 夜间 5 小时,正常 3 小时
工作时间:04:00 - 8:00 = 夜间 2 小时,正常 2 小时
工作时间:16:00 - 22:00 = 夜间 0 小时,正常 6 小时
这是我到目前为止的代码(班次是员工的实际工作时间),但它不起作用。它不适用于午夜之后的工作时间。
DateTime nightTimeStart = new DateTime(1, 1, 1, 23, 0, 0);
DateTime nightTimeEnd = new DateTime(1, 1, 2, 6, 0, 0);
if (shift.UntilTime < nightTimeStart || shift.FromTime > nightTimeEnd)
return 0;
else if (shift.UntilTime <= nightTimeEnd && shift.FromTime >= nightTimeStart)
return (decimal)(shift.UntilTime - shift.FromTime).TotalHours;
else if (shift.UntilTime > nightTimeEnd && shift.FromTime < nightTimeStart)
return (decimal)(nightTimeEnd - nightTimeStart).TotalHours;
else if (shift.UntilTime < nightTimeEnd && shift.FromTime < nightTimeStart)
return (decimal)(nightTimeEnd - shift.FromTime).TotalHours;
else
return (decimal)(shift.UntilTime - nightTimeStart).TotalHours;
【问题讨论】:
-
您使用什么数据结构来存储这些值?
-
目前我尝试使用 C# 的日期时间来执行此操作,并将日期部分设置为“0001-01-01”。但我对所有可行的事情持开放态度。可以使用任何解决问题的结构。
-
所以你有这些日期时间,而不是表示为小时的整数?你所有的例子都是:00。另外,04:00 -> 6:00 的例子是不是错了?
-
我刚刚更正了 4:00 到 6:00 的示例,即 4:00 到 8:00。当然,逻辑也应该适用于不均匀的时间,比如 21:35 到 4:40。
-
这是为了实际应用吗?我问是因为您需要考虑有人从 05:30 开始工作,一直工作到 23:30。您可能还需要考虑夏令时 - 尽管这也可以通过使用 UTC 来计算(尽管使用 UTC,您的夜班范围会有所不同,可能会导致午夜重叠的问题)。