日期时间计算C#

时间:2014-10-30 21:27:37

标签: 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/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并编写我的图表。 如果你看到更好的方式,那就是我要找的。

3 个答案:

答案 0 :(得分:0)

一个可能指向方向的小例子:

// 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();

为此你需要小助手类OnPeriod:

public class OnPeriod
{
    public DateTime OnDate { get; set; }
    public DateTime OffDate { get; set; }
    public TimeSpan OnTime {get { return OffDate.Subtract(OnDate); }}
}

<强>更新 这显然不是很精确,因为你可以在比较日期之前已经开始一段时间(DateTime.Now.AddDays(-14))并在它之后结束。但我相信你会自己解决这个问题。

答案 1 :(得分:0)

假设数据始终按时间顺序排列,并以&#34; ON&#34;开头。并以&#34; OFF&#34; ....结束,这是一些非常简单的代码,可以完成工作。

(我实际上并没有从文件中读取它,你可以随意实现它)

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;

答案 2 :(得分:0)

如果您有大量数据,可以将它们导入到sql server表中。 创建显示相关统计信息的人员视图。 要在SQL服务器上查看,可以直接从excel连接。 通过这种方式,可以将数据存储在一个地方,并避免处理文件。