C# 员工时钟计算

C# 员工时钟计算,c#,datetime,time,timespan,C#,Datetime,Time,Timespan,我希望有人能帮我找到一个最佳的解决方案。我有一份时间记录表。它包含每个员工每天每个时钟的数据时间条目 我正试图想出一个好办法来计算每天的工作时间。一名员工每次打卡上班和下班之间的时间间隔 最后的结果必须告诉我以下几点 总工作时间 总超时 每个日志/行提取和显示工作时间和超时之间的时间间隔 比如说 报时:06:00 打卡时间:10:00 时钟:10:15 休息时间=00:15 等等 我试图避免使用多个for循环/foreach循环 这是一段表示时间日志列表的示例代码。类型是。I=时钟输入,O=

我希望有人能帮我找到一个最佳的解决方案。我有一份时间记录表。它包含每个员工每天每个时钟的数据时间条目

我正试图想出一个好办法来计算每天的工作时间。一名员工每次打卡上班和下班之间的时间间隔

最后的结果必须告诉我以下几点

  • 总工作时间
  • 总超时
  • 每个日志/行提取和显示工作时间和超时之间的时间间隔
比如说 报时:06:00 打卡时间:10:00 时钟:10:15

休息时间=00:15

等等

我试图避免使用多个for循环/foreach循环

这是一段表示时间日志列表的示例代码。类型是。I=时钟输入,O=时钟输出。每个班次都有一个区段开始时间和区段结束时间

var blockStart = new TimeSpan(0,6,0,0,0);
var blockEnd = new TimeSpan(0,17,0,0);

var listOfTimeLogs = new List<TimeLog>()
        {
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,6,0,0),Type = "I"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,10,0,0),Type = "O"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,10,15,0),Type = "I"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,12,0,0),Type = "O"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,12,30,0),Type = "I"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,15,0,0),Type = "O"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,15,15,0),Type = "I"},
            new TimeLog() {EntryDateTime = new DateTime(2016,05,20,18,00,0),Type = "O"}
        };
var blockStart=新的时间跨度(0,6,0,0,0);
var blockEnd=新的时间跨度(0,17,0,0);
var listOfTimeLogs=新列表()
{
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,6,0,0),Type=“I”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,10,0,0),Type=“O”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,10,15,0),Type=“I”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,12,0,0),Type=“O”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,12,30,0),Type=“I”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,15,0,0),Type=“O”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,15,15,0),Type=“I”},
new TimeLog(){EntryDateTime=new DateTime(2016,05,20,18,00,0),Type=“O”}
};
希望这有意义。任何帮助都将不胜感激。
谢谢

计算机是专门做循环的

下面是我将如何处理这个问题的一个例子

Program.cs

使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间时钟
{
班级计划
{
静态void Main()
{
var blockStart=新的时间跨度(0,6,0,0);
var blockEnd=新的时间跨度(0,17,0,0);
var listOfTimeLogs=新列表
{
new TimeLog{EntryDateTime=new DateTime(2016,05,20,6,0,0),EntryType=EntryTypes.In},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,10,0,0),EntryType=EntryTypes.Out},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,10,15,0),EntryType=EntryTypes.In},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,12,0,0),EntryType=EntryTypes.Out},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,12,30,0),EntryType=EntryTypes.In},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,15,0,0),EntryType=EntryTypes.Out},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,15,15,0),EntryType=EntryTypes.In},
new TimeLog{EntryDateTime=new DateTime(2016,05,20,18,00,0),EntryType=EntryTypes.Out}
};
//除非使用Linq,否则每个都有for/for
//首先,我会数一数时钟的输入和输出
var totalIn=listOfTimeLogs.Count(e=>e.EntryType==EntryTypes.In);
var totalOut=listOfTimeLogs.Count()-totalIn;
//检查我们是否有时间条目的数量
如果(总输入>总输出)
{
Console.WriteLine(“员工未打卡”);
}
//当我编写这个示例程序时,我想到了另一种存储时间的方法
//我会将它们存储在块中-我们必须循环
var timeBlocks=新列表();
对于(变量x=0;xb.BlockType==BlockTypes.Working)
.合计(新的时间跨度(0),(p,v)=>p.Add(v.Duration));
var breakTime=时间块。其中(b=>b.BlockType==BlockTypes.Break)
.合计(新的时间跨度(0),(p,v)=>p.Add(v.Duration));
Console.WriteLine($“\n总工作时间