I am in need of some assistance in getting 2 datetimes to split into the hour intervals between them.
This is working with 'pay' data, so it needs to be very accurate. I need to take clockin and clockout, and split them into hour intervals.
Example:
clockin = 5/25/2011 1:40:56PM
clockout = 5/25/2011 6:22:12PM
I need that to look like:
5/25/2011 1:40:56PM
5/25/2011 2:00:00PM
5/25/2011 3:00:00PM
5/25/2011 4:00:00PM
5/25/2011 5:00:00PM
5/25/2011 6:00:00PM
5/25/2011 6:22:12PM
I then plan to check tho开发者_运维知识库se times against a 'differential' table to see fi they should have a new paycode. But I'll worry about the paycode later.
Any help splitting out the times? Prefer C#, but I also have access to MSSQL2000 (which is where we pull the original times)
How about something like this?
static IEnumerable<DateTime> 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;
}
This uses iterator blocks but it could easily be rewritten to return a list instead.
Example use:
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();
}
Output:
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
Update: LukeH was clever enough to suggest that you should also copy the DateTimeKind. This is indeed a smart move if you're planning on converting the datetimes to/from local time later on.
var hours = new List<DateTime>();
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);
I think something like this should work:
public IEnumerable<DateTime> GetHourlyBreakdown(DateTime startDate, DateTime endDate)
{
var hours = new List<DateTime>();
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;
}
I would do this:
public static IEnumerable<DateTime> 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;
}
Use it like this:
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);
}
精彩评论