C# 日期时间计算

C# 日期时间计算,c#,datetime,text-files,C#,Datetime,Text Files,我希望报告一台机器的运行时间百分比。我需要年初至今、最后两周、昨天和今天的运行时间百分比。我不想一开始就走错方向,所以我需要一些建议。我的数据在文本文件中看起来像这样 10/21/2014 07:45:31,ON 10/21/2014 07:45:41,OFF 10/21/2014 07:46:11,ON 10/21/2014 07:46:21,OFF 10/21/2014 07:46:41,ON 10/21/2014 07:46:51,OFF 10/21/2014 07:47:12,ON 10

我希望报告一台机器的运行时间百分比。我需要年初至今、最后两周、昨天和今天的运行时间百分比。我不想一开始就走错方向,所以我需要一些建议。我的数据在文本文件中看起来像这样

10/21/2014 07:45:31,ON
10/21/2014 07:45:41,OFF
10/21/2014 07:46:11,ON
10/21/2014 07:46:21,OFF
10/21/2014 07:46:41,ON
10/21/2014 07:46:51,OFF
10/21/2014 07:47:12,ON
10/21/2014 07:47:22,OFF
10/21/2014 14:17:35,ON
10/21/2014 14:17:55,OFF
10/21/2014 14:18:25,ON
10/21/2014 14:18:35,OFF
10/21/2014 15:51:21,ON
10/21/2014 15:51:51,OFF
10/21/2014 15:53:01,ON
10/21/2014 15:58:22,OFF
10/21/2014 15:58:32,ON
10/21/2014 16:12:33,OFF
10/21/2014 16:12:42,ON
10/21/2014 16:16:33,OFF
10/21/2014 16:16:43,ON
我计划用C语言写这篇文章。我的想法是用C语言计算这篇文章,然后把数据写到另一个逗号分隔的文本文件中,我可以把它放到excel中。我已经在excel中完成了这项工作,但速度非常慢,我将有一年的时间来处理数据。 我希望最终绕过excel,编写图表。
如果你能找到更好的方法,那就是我要找的。

一个小例子,可以为你指明方向:

// Get all the lines
var lines = File.ReadAllLines("myfile.txt");

// Create a list of OnPeriods (see below) which then can be used for statistics
var onPeriods = new List<OnPeriod>();

// Make sure we're starting with an 'ON' line, otherwise ignore the first line and take the 2nd
var start = lines[0].Contains("ON") ? 0 : 1;

for (int i = start; i < lines.Count(); i = i+2)
{
    // Parse out datetimes
    var dateOn = DateTime.Parse(lines[i].Split(',')[0]);
    var dateOff = DateTime.Parse(lines[i + 1].Split(',')[0]);

    // Add period
    onPeriods.Add(new OnPeriod{OnDate = dateOn, OffDate = dateOff});
}

// Now you can do all kind of magic like
var secondsOnInTheLastTwoWeeks = onPeriods.Where(p => p.OnDate > DateTime.Now.AddDays(-14)).Select(p => p.OnTime.Seconds).Sum();
更新
这显然不是很精确,因为您可能有一个时间段在比较日期DateTime.Now.AddDays-14之前就已经开始,在它之后就结束了。但我相信你会自己弄明白的。

假设数据总是按时间顺序排列,以开开始,以关结束……下面是一些非常简单的代码,可以完成这项工作

我实际上并没有从文件中读取它,您可以根据需要实现它

string[] times = {  "10/21/2014 07:45:31,ON",
                    "10/21/2014 07:45:41,OFF",
                    "10/21/2014 07:46:11,ON",
                    "10/21/2014 07:46:21,OFF",
                    "10/21/2014 07:46:41,ON",
                    "10/21/2014 07:46:51,OFF",
                    "10/21/2014 07:47:12,ON",
                    "10/21/2014 07:47:22,OFF",
                    "10/21/2014 14:17:35,ON",
                    "10/21/2014 14:17:55,OFF",
                    "10/21/2014 14:18:25,ON",
                    "10/21/2014 14:18:35,OFF",
                    "10/21/2014 15:51:21,ON",
                    "10/21/2014 15:51:51,OFF",
                    "10/21/2014 15:53:01,ON",
                    "10/21/2014 15:58:22,OFF",
                    "10/21/2014 15:58:32,ON",
                    "10/21/2014 16:12:33,OFF",
                    "10/21/2014 16:12:42,ON",
                    "10/21/2014 16:16:33,OFF"
                };   

TimeSpan upTime = new TimeSpan();         

for (int i = 0; i < times.Length; i += 2)
{
    var start = times[i].Split(',');
    var stop = times[i + 1].Split(',');

    upTime += DateTime.Parse(stop[0]) - DateTime.Parse(start[0]);
}

var begin = DateTime.Parse(times.First().Split(',')[0]);
var end = DateTime.Parse(times.Last().Split(',')[0]);
var totalTime = end - begin;
var percentUp = upTime.TotalSeconds / totalTime.TotalSeconds;

如果您有大量数据,可以将它们导入sql server表中。 创建显示相关统计信息的用户的视图。 要在SQL server上查看,可以直接从excel连接到。
这样,您可以将数据存储在一个位置,并避免处理文件。

TimeSpan将是最佳选择。我已编辑了您的标题。请看,如果共识是否定的,他们就不应该这样做。是否有一个源文件或类似于每个日期都有一个源文件?这里有什么问题吗?你是在问如何解析这个文件吗?如何计算一台机器在某一天运行的时/分/秒数?如何将结果写入文本文件?您已经告诉了我们您的数据是什么样子的,并且含糊不清地告诉了我们您想用它做什么。你试过什么吗?给我们具体的问题。如果有两个连续的在线,或者两个连续的离线,你的代码会怎么样?你认为这是一个合理的可能性,你应该考虑吗?我不知道如何'干净'的文件。如果这种可能性存在,那么它显然会变得更加复杂。但提供的示例数据并未显示这些情况。
string[] times = {  "10/21/2014 07:45:31,ON",
                    "10/21/2014 07:45:41,OFF",
                    "10/21/2014 07:46:11,ON",
                    "10/21/2014 07:46:21,OFF",
                    "10/21/2014 07:46:41,ON",
                    "10/21/2014 07:46:51,OFF",
                    "10/21/2014 07:47:12,ON",
                    "10/21/2014 07:47:22,OFF",
                    "10/21/2014 14:17:35,ON",
                    "10/21/2014 14:17:55,OFF",
                    "10/21/2014 14:18:25,ON",
                    "10/21/2014 14:18:35,OFF",
                    "10/21/2014 15:51:21,ON",
                    "10/21/2014 15:51:51,OFF",
                    "10/21/2014 15:53:01,ON",
                    "10/21/2014 15:58:22,OFF",
                    "10/21/2014 15:58:32,ON",
                    "10/21/2014 16:12:33,OFF",
                    "10/21/2014 16:12:42,ON",
                    "10/21/2014 16:16:33,OFF"
                };   

TimeSpan upTime = new TimeSpan();         

for (int i = 0; i < times.Length; i += 2)
{
    var start = times[i].Split(',');
    var stop = times[i + 1].Split(',');

    upTime += DateTime.Parse(stop[0]) - DateTime.Parse(start[0]);
}

var begin = DateTime.Parse(times.First().Split(',')[0]);
var end = DateTime.Parse(times.Last().Split(',')[0]);
var totalTime = end - begin;
var percentUp = upTime.TotalSeconds / totalTime.TotalSeconds;