根据工作日和小时数 + 假期将工作时间添加到正确的价格类别

用户2818430

我想将正确的小时数绑定到正确的工作时间。工作周是从周一到周日。根据一天中的时间,工作有不同的价格。基于一天中完成时间的工作价格称为期间。我们使用 24 小时时间格式。

例子:

  • 时段1:周一至周五,00:00 - 07:00
  • 时段2:周一至周五,07:00 - 20:00
  • 时段3:周一至周五,20:00 - 22:00
  • 时段4:周一至周五,22:00 - 23:59(午夜)
  • 时段5:周六至周日,00:00 - 07:00
  • 时段6:周六至周日,07:00 - 22:00
  • 时段7:周六至周日,22:00 - 23:59(午夜)
  • 时段8:节假日,00:00 - 23:59

期间表示如下:

public class Period
{
   public Period()
   {
   }

   public string Name { get; set; }
   public int Days { get; set; }
   public bool Holiday { get; set; }
   public TimeSpan Start { get; set; }
   public TimeSpan End { get; set; }
}

Days 是 int 但值将来自这个枚举:

[Flags]
public enum Workweek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}

当 PeriodDays属性62为时 表示 Period 从星期一到星期五有效,当 Days 是:65Period 是从星期六到星期日。当天数是:6期间是从星期一到星期二。

何时Holiday为真表示该期间仅在假期有效。假日日覆盖正常日或周末。

工作班次表示如下:

public class Work
{
   public Work()
   {
   }

   public string Name { get; set; }
   public DateTime Start { get; set; }
   public DateTime End { get; set; }
}

假设我有一个List<Work>和一个List<Period>如何将工作时间绑定到正确的时间段?每个时期都有不同的定价。

例子:

案例 1:如果您在周一 15:00 到 23:00 之间进行轮班,那么该轮班将是这样的:

  • Period2:5小时
  • 第三期:2小时
  • 第四期:1小时

案例 1.1:如果那个特定的星期一是假期,那么它将是:

  • Period8:8小时

情况 2:如果相反,工作在星期一 20:00 开始并在第二天 04:00 结束,结果将是:

  • 第三期:2小时
  • 第四期:2小时
  • 周期1:4小时

案例 2.2:如果那个星期一是假期,它将是:

  • 第8期:4小时
  • 周期1:4小时

假期是作为一个List<DateTime>

我如何将小时数与正确的时间相匹配?

到目前为止我尝试过的:

Work work = new Work()
{
    Name = Demo,
    Star = new DateTime(2017,05,02,15,00,00);
    End = new DateTime(2017,05,02,23,00,00);
};

List<Period> periods = new List<Period>();

foreach (var period in periods)
{
    Workweek shiftDay = (Workweek)Enum.Parse(typeof(Workweek), work.Start.DayOfWeek, true); // i think this is wrong, because in the case where the end date is in the next day


    Workweek periodDay = (Workweek)period.Days;

    if ((shiftDay & periodDay) == shiftDay)
    {
        // the work matches the period
    }

}

我想我应该使用 foreach 并在开始日期和结束日期之间循环每一秒,并检查该秒是否与期间日匹配。

像这样的东西:

  public static IEnumerable<DateTime> EachSecond(this Work work)
    {
        DateTime currentSecond = new DateTime(work.Start.Year, work.Start.Month, work.Start.Day, work.Start.Hour, work.Start.Minute, work.Start.Second, work.Start.Millisecond);
        while (currentSecond <= wor.kEnd)
        {
            yield return currentSecond;
            currentSecond = currentSecond.AddSeconds(1);
        }
    }

   Work work = new Work()
   {
      Name = Demo,
      Star = new DateTime(2017,05,02,15,00,00);
      End = new DateTime(2017,05,02,23,00,00);
   };

    List<Period> periods = new List<Period>();

    foreach (var second in work.EachSecond())
    {
          Workweek shiftSecond = (Workweek)Enum.Parse(typeof(Workweek), second.DayOfWeek, true);

          foreach (var period in periods)
          {
               Workweek periodDay = (Workweek)period.Days;

               if ((shiftSecond & periodDay) == shiftSecond)
               {

               }
          }
    }
鲁福爵士

工作示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

public class Program
{
    public static void Main( string[] args )
    {
        var periods = new List<Period> {
            new Period( "1", Days.Workdays, TimeSpan.FromHours(0), TimeSpan.FromHours(7) ),
            new Period( "2", Days.Workdays, TimeSpan.FromHours(7), TimeSpan.FromHours(20) ),
            new Period( "3", Days.Workdays, TimeSpan.FromHours(20), TimeSpan.FromHours(22) ),
            new Period( "4", Days.Workdays, TimeSpan.FromHours(22), TimeSpan.FromHours(24) ),
            new Period( "5", Days.Weekend, TimeSpan.FromHours(0), TimeSpan.FromHours(7) ),
            new Period( "6", Days.Weekend, TimeSpan.FromHours(7), TimeSpan.FromHours(22) ),
            new Period( "7", Days.Weekend, TimeSpan.FromHours(22), TimeSpan.FromHours(24) ),
            new Period( "8", Days.Holiday, TimeSpan.FromHours(0), TimeSpan.FromHours(24) ),
        };
        var holidays = new List<DateTime> {
            new DateTime( 2017, 1, 1 ),
            new DateTime( 2017, 1, 3 ),
            new DateTime( 2017, 1, 6 ),
        };

        var sc = new ShiftCalculator( periods, holidays );

        var shiftperiods = sc.GetShiftPeriods( new DateTime( 2016, 12, 31, 22, 00, 00 ), new DateTime( 2017, 01, 07, 08, 00, 00 ) ).ToList();

        foreach ( var sp in shiftperiods )
        {
            Console.WriteLine( "{0} - {1} - {2} - {3:00.00}h", sp.Period.Name, sp.Period.Days, sp.Start, sp.Duration.TotalHours );
        }

    }
}

[Flags]
enum Days : byte
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,
    Holiday = 128,

    Workdays = Monday | Tuesday | Wednesday | Thursday | Friday,
    Weekend = Saturday | Sunday,
}

[DebuggerDisplay("{Name}: {Days} ({Start}-{End})")]
class Period
{
    public Period( string name, Days days, TimeSpan start, TimeSpan end )
    {
        if ( days.HasFlag( Days.Holiday ) && days != Days.Holiday )
            throw new ArgumentException( "days" );

        if ( start > end )
            throw new ArgumentException( "end" );

        Name = name;
        Days = days;
        Start = start;
        End = end;
    }

    public string Name { get; private set; }
    public Days Days { get; private set; }
    public TimeSpan Start { get; private set; }
    public TimeSpan End { get; private set; }
}

class ShiftPeriod
{
    public Period Period { get; set; }
    public DateTime Start { get; set; }
    public TimeSpan Duration { get; set; }
}

class ShiftCalculator
{
    private readonly List<Period> _periods;
    private readonly List<DateTime> _holidays;

    public ShiftCalculator( IEnumerable<Period> periods, IEnumerable<DateTime> holidays )
    {
        _periods = periods.ToList();
        _holidays = holidays.Select( e => e.Date ).ToList();
    }

    public IEnumerable<ShiftPeriod> GetShiftPeriods( DateTime start, DateTime end )
    {
        if ( start > end ) throw new ArgumentException( "end" );

        var current = start;

        while ( current < end )
        {
            var period = GetPeriodByDateTime( current );

            var next = current.Date + period.End;

            if ( next > end )
            {
                next = end;
            }

            yield return new ShiftPeriod
            {
                Period = period,
                Start = current,
                Duration = next - current,
            };

            current = next;
        }

    }

    private Days GetDayFromDateTime( DateTime datetime )
    {
        Days day;
        if ( _holidays.Contains( datetime.Date ) )
        {
            day = Days.Holiday;
        }
        else
        {
            switch ( datetime.DayOfWeek )
            {
                case DayOfWeek.Sunday:
                day = Days.Sunday;
                break;
                case DayOfWeek.Monday:
                day = Days.Monday;
                break;
                case DayOfWeek.Tuesday:
                day = Days.Tuesday;
                break;
                case DayOfWeek.Wednesday:
                day = Days.Wednesday;
                break;
                case DayOfWeek.Thursday:
                day = Days.Thursday;
                break;
                case DayOfWeek.Friday:
                day = Days.Friday;
                break;
                case DayOfWeek.Saturday:
                day = Days.Saturday;
                break;
                default:
                throw new InvalidOperationException();
            }
        }
        return day;
    }

    private Period GetPeriodByDateTime( DateTime datetime )
    {
        var day = GetDayFromDateTime( datetime );
        var timeOfDay = datetime.TimeOfDay;
        var period = _periods.Where(
            e => e.Days.HasFlag( day ) && e.Start <= timeOfDay && e.End > timeOfDay )
            .FirstOrDefault();
        if ( period == null )
        {
            throw new InvalidOperationException();
        }
        return period;
    }
}

.net 小提琴

生成的输出

7 - 周末 - 12/31/2016 10:00:00 PM - 02.00h 
8 - 假期 - 1/1/2017 12:00:00 AM - 24.00h 
1 - 工作日 - 1/2/2017 12:00:00 AM - 07.00h 
2 - 工作日 - 1/2/2017 7:00:00 AM - 13.00h 
3 - 工作日 - 1/2/2017 8:00:00 PM - 02.00h 
4 - 工作日 - 2017/1/2 10 :00:00 PM - 02.00h 
8 - 假期 - 1/3/2017 12:00:00 AM - 24.00h 
1 - 工作日 - 1/4/2017 12:00:00 AM - 07.00h 
2 - 工作日 - 1/ 4/2017 7:00:00 AM - 13.00h 
3 - 工作日 - 1/4/2017 8:00:00 PM - 02.00h 
4 - 工作日 - 1/4/2017 10:00:00 PM - 02.00h 
1 -工作日 - 1/5/2017 12:00:00 AM - 07.00h 
2 - 工作日 - 1/5/2017 7:00:00 AM - 13.00h 
3 - 工作日 - 1/5/2017 8:00:00 PM - 02.00h
4 - 工作日 - 1/5/2017 10:00:00 PM - 02.00h
8 - 假期 - 1/6/2017 12:00:00 AM - 24.00h 
5 - 周末 - 1/7/2017 12:00:00 AM - 07.00h 
6 - 周末 - 2017/1/7 7:00:00上午 - 01:00

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

选择语句中的跨工作日和小时数并计算记录

来自分类Dev

计算一个工作日的小时数,该工作日分为2天-Access SQL

来自分类Dev

Postgres工作日频率(小时)

来自分类Dev

Postgres工作日频率(小时)

来自分类Dev

如何将DF中的字段解析为月,日,年,小时和工作日?

来自分类Dev

有没有更好的方法来计算从日期中减去工作日小时数的新日期?

来自分类Dev

如何从 DateTime 字符串中检索月、月日、工作日和小时?

来自分类Dev

SQL查询基于时间戳选择按小时(col)和工作日(行)分组的值

来自分类Dev

将5个工作日添加到时间戳记

来自分类Dev

数据库设计:工作日和小时的可用性

来自分类Dev

sql通过打开和关闭时间范围来计算工作日的工作时间

来自分类Dev

在熊猫中,如何根据特定的工作日和时间范围进行过滤

来自分类Dev

根据当前日期和工作日列表获取日期

来自分类Dev

如何根据工作日的开始日期、劳动力和预算工时返回预测日期?

来自分类Dev

翻译PHP工作日和月份

来自分类Dev

如何将工作时间转换为工作日?

来自分类Dev

根据给定的月份开始工作日查找日期的工作日

来自分类Dev

如何为Excel Project Plan Tracker计算8小时工作日和完成日期

来自分类Dev

如何在PL / pgSQL中根据开始日期和持续时间(工作日)获取结束日期?

来自分类Dev

如何根据工作日通过php更改css图像

来自分类Dev

根据工作日在Excel中计算平均值

来自分类Dev

根据工作日掩码值查找星期几

来自分类Dev

工作日的Python公共假期

来自分类Dev

用工作日和日历日更新表

来自分类Dev

分组和总工作小时数(按天)

来自分类Dev

将工作日添加到基于其他列的pandas df日期列

来自分类Dev

NSArray与工作日

来自分类Dev

计算工作日

来自分类Dev

Excel中计算时间表中特定小时数以上的工作日数最简单的方法是什么?

Related 相关文章

  1. 1

    选择语句中的跨工作日和小时数并计算记录

  2. 2

    计算一个工作日的小时数,该工作日分为2天-Access SQL

  3. 3

    Postgres工作日频率(小时)

  4. 4

    Postgres工作日频率(小时)

  5. 5

    如何将DF中的字段解析为月,日,年,小时和工作日?

  6. 6

    有没有更好的方法来计算从日期中减去工作日小时数的新日期?

  7. 7

    如何从 DateTime 字符串中检索月、月日、工作日和小时?

  8. 8

    SQL查询基于时间戳选择按小时(col)和工作日(行)分组的值

  9. 9

    将5个工作日添加到时间戳记

  10. 10

    数据库设计:工作日和小时的可用性

  11. 11

    sql通过打开和关闭时间范围来计算工作日的工作时间

  12. 12

    在熊猫中,如何根据特定的工作日和时间范围进行过滤

  13. 13

    根据当前日期和工作日列表获取日期

  14. 14

    如何根据工作日的开始日期、劳动力和预算工时返回预测日期?

  15. 15

    翻译PHP工作日和月份

  16. 16

    如何将工作时间转换为工作日?

  17. 17

    根据给定的月份开始工作日查找日期的工作日

  18. 18

    如何为Excel Project Plan Tracker计算8小时工作日和完成日期

  19. 19

    如何在PL / pgSQL中根据开始日期和持续时间(工作日)获取结束日期?

  20. 20

    如何根据工作日通过php更改css图像

  21. 21

    根据工作日在Excel中计算平均值

  22. 22

    根据工作日掩码值查找星期几

  23. 23

    工作日的Python公共假期

  24. 24

    用工作日和日历日更新表

  25. 25

    分组和总工作小时数(按天)

  26. 26

    将工作日添加到基于其他列的pandas df日期列

  27. 27

    NSArray与工作日

  28. 28

    计算工作日

  29. 29

    Excel中计算时间表中特定小时数以上的工作日数最简单的方法是什么?

热门标签

归档