你如何在C#中的日期字段上进行周末舍入(不使用LINQ)?

时间:2008-10-27 16:35:11

标签: c# .net datetime

我有一个奇怪的日期舍入问题,希望有人可以解决。我的客户使用从周一到周日的工作周。星期日的日期被视为本周结束,用于识别特定周内输入的所有记录(因此上周输入的任何内容的WEEKDATE值为'10 / 26/2008',即星期日的日期)。

有一点小小的变化是用户输入前一周的记录,直到本周一的星期一上午11点。

所以我需要一个以DateTime.Now开头的函数,并根据上面的规则返回周末日期(没有时间部分)。谢谢你的帮助。我有一个有效的解决方案,但我很尴尬发布它。

哦,我不能使用LINQ。

4 个答案:

答案 0 :(得分:4)

public DateTime WeekNum(DateTime now)
{
    DateTime NewNow = now.AddHours(-11).AddDays(6);

    return (NewNow.AddDays(- (int) NewNow.DayOfWeek).Date);
}

public void Code(params string[] args)
{

    Console.WriteLine(WeekNum(DateTime.Now));   
    Console.WriteLine(WeekNum(new DateTime(2008,10,27, 10, 00, 00)));
    Console.WriteLine(WeekNum(new DateTime(2008,10,27, 12, 00, 00)));
    Console.WriteLine(WeekNum(new DateTime(2008,10,28)));
    Console.WriteLine(WeekNum(new DateTime(2008,10,25)));


}

您可以对DateTime.Now进行硬编码,而不是传递DateTime对象。它只是通过这种方式使测试变得更容易。

答案 1 :(得分:4)

这也适合我:

[Test]
public void Test()
{
   DateTime sunday = DateTime.Parse("10/26/2008");
   DateTime nextSunday = DateTime.Parse("11/2/2008");

   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/21/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/22/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/23/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/24/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/25/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/26/2008")));
   Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/27/2008 10:59 AM")));
   Assert.AreEqual(nextSunday, GetSunday(DateTime.Parse("10/27/2008 11:00 AM")));
}

private DateTime GetSunday(DateTime date)
{
   if (date.DayOfWeek == DayOfWeek.Monday && date.Hour < 11)
      return date.Date.AddDays(-1);

   while (date.DayOfWeek != DayOfWeek.Sunday)
      date = date.AddDays(1);

   return date.Date;
}

答案 2 :(得分:1)

DateTime GetMidnightFollowingSunday()
{
    DateTime now = DateTime.Now;
    return now.AddDays(7 - (int)now.DayOfWeek).Date;
}

如果您需要在星期一早上11点之后开始新的一周,那么从现在开始减去11个小时,但是将方法命名为其他东西可能是有意义的。

DateTime GetRecordDate()
{
    DateTime nowMinusOffset = DateTime.Now.AddHours(-11);
    return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date;
}

答案 3 :(得分:0)

我使用这些扩展取得了巨大成功:

http://www.codeplex.com/DateTimeExtensions