我有一个奇怪的日期舍入问题,希望有人可以解决。我的客户使用从周一到周日的工作周。星期日的日期被视为本周结束,用于识别特定周内输入的所有记录(因此上周输入的任何内容的WEEKDATE值为'10 / 26/2008',即星期日的日期)。
有一点小小的变化是用户输入前一周的记录,直到本周一的星期一上午11点。
所以我需要一个以DateTime.Now开头的函数,并根据上面的规则返回周末日期(没有时间部分)。谢谢你的帮助。我有一个有效的解决方案,但我很尴尬发布它。
哦,我不能使用LINQ。
答案 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)
我使用这些扩展取得了巨大成功: