2017-07-26 141 views
0

我有呈現始於BeginEnd結束一段時間範圍(週期)類:拆分日期時間範圍爲小時的時間

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

什麼是做分手的最佳方式?

+1

你想只有時間存儲在'Period'對象,還是你仍想存儲'日期時間「,只顯示時間? –

+2

你試過了什麼? https://stackoverflow.com/questions/1847580/how-do-i-loop-through-a-date-range與天工作,但很容易轉換爲小時。 – CodeCaster

+0

我想存儲DateTime,並顯示DateTime – pitersmx

回答

2
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 
+0

請記錄此代碼轉儲並解釋它如何解決OP的問題。 – CodeCaster

1

你可以寫一個簡單的方法,它開始和結束的日期時間爲對象和返回段的集合。

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); 
    } 
} 
1

試試這個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