sql server-C#将时间拆分为小时块



我需要一些帮助,将2个日期时间划分为两个日期时间之间的小时间隔。

这与"薪酬"数据有关,因此需要非常准确。我需要打卡和下班,并将它们划分为小时间隔。

示例:

打卡时间=2011年5月25日下午1:40:56

打卡时间=2011年5月25日下午6:22:12

我需要它看起来像:

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

2011年5月25日下午2:00

2011年5月25日下午3:00

2011年5月25日下午4:00

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

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

2011年5月25日下午6:22:12

然后,我计划对照"差异"表检查这些时间,看看他们是否应该有一个新的支付代码。但我稍后会担心付款码的问题。

能帮我把时间分开吗?更喜欢C#,但我也可以访问MSSQL2000(这是我们提取原始时间的地方)

这样的东西怎么样?

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

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

示例用法:

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:562011年5月25日14:00:002011年5月25日15:00:002011年5月25日16:00:002011年5月25日17:00:002011年5月25日18:00:002011年5月25日18:22:12

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

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

我认为这样的东西应该有效:

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

我会这样做:

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

这样使用:

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

相关内容

  • 没有找到相关文章

最新更新