C#将时间分成小时块

我需要一些帮助才能将2个日期时间拆分为它们之间的小时间隔。

这与“付费”数据有关,因此需要非常准确。 我需要使用clockin和clockout,并将它们分成小时间隔。

例:

clockin = 5/25/2011 1:40:56 PM

clockout = 5/25/2011 6:22:12 PM

我需要它看起来像:

2011年5月25日下午1:40:56

5/25/2011 2:00:00 PM

5/25/2011 3:00:00 PM

2011年5月25日下午4:00:00

5/25/2011 5:00:00 PM

5/25/2011 6:00:00 PM

5/25/2011 6:22:12 PM

然后,我计划在“差异”表格中查看这些时间,看看他们应该有一个新的付费代码。 但我稍后会担心付费代码。

什么帮助分裂时代? 喜欢C#,但我也可以访问MSSQL2000(这是我们拉原始时间的地方)

var hours = new List(); hours.Add(clockin); var next = new DateTime(clockin.Year, clockin.Month, clockin.Day, clockin.Hour, 0, 0, clockin.Kind); while ((next = next.AddHours(1)) < clockout) { hours.Add(next); } hours.Add(clockout); 

这样的事怎么样?

 static IEnumerable GetWorkingHourIntervals(DateTime clockIn, DateTime clockOut) { yield return clockIn; DateTime d = new DateTime(clockIn.Year, clockIn.Month, clockIn.Day, clockIn.Hour, 0, 0, clockIn.Kind).AddHours(1); while (d < clockOut) { yield return d; d = d.AddHours(1); } yield return clockOut; } 

这使用迭代器块,但可以很容易地重写它以返回列表。

使用示例:

 static void Main(string[] args) { var clockIn = new DateTime(2011, 5, 25, 13, 40, 56); var clockOut = new DateTime(2011, 5, 25, 18, 22, 12); var hours = GetWorkingHourIntervals(clockIn, clockOut); foreach (var h in hours) Console.WriteLine(h); Console.ReadLine(); } 

输出:

  2011-05-25 13:40:56
 2011-05-25 14:00:00
 2011-05-25 15:00:00
 2011-05-25 16:00:00
 2011-05-25 17:00:00
 2011-05-25 18:00:00
 2011-05-25 18:22:12

更新 : LukeH非常聪明地建议你也应该复制DateTimeKind。 如果您计划稍后将日期时间转换为本地时间,那么这确实是一个明智之举。

我认为这样的事情应该有效:

 public IEnumerable GetHourlyBreakdown(DateTime startDate, DateTime endDate) { var hours = new List(); hours.Add(startDate); var currentDate = new DateTime(startDate.Year, startDate.Month, startDate.Day, startDate.Hour, 0, 0).AddHours(1); while(currentDate < endDate) { hours.Add(new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, currentDate.Hour, 0, 0)); currentDate = currentDate.AddHours(1); } hours.Add(endDate); return hours; } 

我会这样做:

 public static IEnumerable GetIntervals(DateTime clockIn, DateTime clockOut) { yield return clockIn; clockIn = clockIn.AddHours(1).Subtract(clockIn.TimeOfDay).AddHours(clockIn.Hour); for (DateTime dt = clockIn; dt < clockOut; dt = dt.AddHours(1)) yield return dt; yield return clockOut; } 

像这样用它:

  foreach (DateTime dt in GetIntervals(DateTime.Parse("5/25/2011 1:40:56PM", CultureInfo.InvariantCulture), DateTime.Parse("5/25/2011 6:22:12PM", CultureInfo.InvariantCulture))) { Console.WriteLine(dt); }