【问题标题】:Split DateTime range into hour periods将 DateTime 范围拆分为小时段
【发布时间】:2018-01-01 17:05:04
【问题描述】:

我有一门课,它展示了从Begin 开始到End 结束的一些时间范围(周期):

public class Period  
{
    public DateTime Begin { get; set; }
    public DateTime End { get; set; }
}

假设Begin = 01/07/2017 7:50:00End = 01/07/2017 12:30:00

我需要得到的是一组更详细的 Period 对象集合,这些对象将由每小时拆分的时段组成 - 示例的输出应该是这样的(省略日期部分):

[0]Begin = 7:50:00, End = 7:59:59

[1]Begin = 8:00:00, End = 8:59:59

[2]Begin = 9:00:00, End = 9:59:59

[3]Begin = 10:00:00, End = 10:59:59

[4]Begin = 11:00:00, End = 11:59:59

[5]Begin = 12:00:00, End = 12:29:59

进行拆分的最佳方法是什么?

【问题讨论】:

  • 您是只想在Period 对象中存储时间,还是仍想存储DateTime 并只显示时间?
  • 你试过什么? stackoverflow.com/questions/1847580/… 适用于天,但很容易转换为小时。
  • 我要存储DateTime,并显示DateTime
  • @pitersmx 你想玩DateTime?在您的示例输出中,只有一个时间......
  • @CodeCaster 我会试试这个

标签: c#


【解决方案1】:
Period period = new Period();
period.Begin = new DateTime(2017, 7,1, 7,50,0);
period.End = new DateTime(2017, 7, 1, 12, 30, 0);

DateTime start = period.Begin;

List<Period> periods = new List<Period>();
while(start < period.End)
{
   DateTime end = start;
   end = end.AddMinutes(-end.Minute);
   end = end.AddSeconds(-1);
   end = end.AddHours(1);
   if(end > period.End)
      end = period.End;

   periods.Add(new Period{Begin = start, End = end});
   start = end.AddSeconds(1);
}

foreach(var p in periods)
{
   Console.WriteLine($"Start: {p.Begin.ToLongTimeString()} End: 
   {p.End.ToLongTimeString()}");
}

这会导致

Start: 07:50:00 End: 07:59:59
Start: 08:00:00 End: 08:59:59
Start: 09:00:00 End: 09:59:59
Start: 10:00:00 End: 10:59:59
Start: 11:00:00 End: 11:59:59
Start: 12:00:00 End: 12:30:00

【讨论】:

  • 请记录此代码转储并解释它如何解决 OP 的问题。
【解决方案2】:

您可以编写一个简单的方法,将 start 和 end 作为 DateTime 对象并返回一个句点集合。

static IEnumerable<Period> GetPeriods (DateTime start, DateTime end)
{
    // Create a DateTime as a pointer to increment
    DateTime ptr = start;
    while (ptr < end)
    {
        // Return a new Period, starting with the current pointer time and ending with
        //   the pointer time plus 00:59:59 (59 * 60 + 59 = 3599s)
        yield return new Period() { Start = ptr, End = ptr.AddSeconds(3599) };

        // Increment the pointer
        ptr = ptr.AddHours(1);
    }
}

【讨论】:

    【解决方案3】:

    试试这个solution:

    var periods = new List<Period>();
    var period = new Period 
    { 
        Begin = new DateTime(2017, 07, 01, 7, 50, 0), 
        End = new DateTime(2017, 07, 01, 12, 30, 0) 
    };        
    var previous = period.Begin;
    
    do
    {
        var next = new Period 
        { 
            End = previous.AddSeconds(3600 - previous.Minute * 60 - 1), 
            Begin = previous 
        };
        previous = next.End.AddSeconds(1);
        if (next.End < period.End.AddSeconds(-1))
            periods.Add(next);
        else
        {
            next.End = period.End.AddSeconds(-1);
            periods.Add(next);
            break;
        }                
    } while (true);
    

    结果:

    7/1/2017 7:50:00 AM - 7/1/2017 7:59:59 AM
    7/1/2017 8:00:00 AM - 7/1/2017 8:59:59 AM
    7/1/2017 9:00:00 AM - 7/1/2017 9:59:59 AM
    7/1/2017 10:00:00 AM - 7/1/2017 10:59:59 AM
    7/1/2017 11:00:00 AM - 7/1/2017 11:59:59 AM
    7/1/2017 12:00:00 PM - 7/1/2017 12:29:59 PM
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多