如何在C#中对日期字段进行周末舍入(不使用LINQ)?
我有一个奇怪的日期取整问题,希望有人能解决。我的客户使用从周一到周日的工作周。星期天的日期被视为一周的结束日期,用于标识在特定一周内输入的所有记录(因此上周输入的任何内容的工作日值均为“10/26/2008”,即星期天的日期) 一个小小的转变是,用户输入前一周的记录,直到本周星期一上午11点 因此,我需要一个以DateTime.Now开头的函数,并根据上述规则返回一周结束日期(无时间部分)。谢谢你的帮助。我有一个有效的解决方案,但我太尴尬了,无法发布它 哦,我不能用LINQ如何在C#中对日期字段进行周末舍入(不使用LINQ)?,c#,.net,datetime,C#,.net,Datetime,我有一个奇怪的日期取整问题,希望有人能解决。我的客户使用从周一到周日的工作周。星期天的日期被视为一周的结束日期,用于标识在特定一周内输入的所有记录(因此上周输入的任何内容的工作日值均为“10/26/2008”,即星期天的日期) 一个小小的转变是,用户输入前一周的记录,直到本周星期一上午11点 因此,我需要一个以DateTime.Now开头的函数,并根据上述规则返回一周结束日期(无时间部分)。谢谢你的帮助。我有一个有效的解决方案,但我太尴尬了,无法发布它 哦,我不能用LINQ public Dat
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对象。这样做只会使测试更容易。我也能接受:
[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;
}
[测试]
公开无效测试()
{
DateTime sunday=DateTime.Parse(“10/26/2008”);
DateTime nextSunday=DateTime.Parse(“11/2/2008”);
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”));
AreEqual(sunday,GetSunday(DateTime.Parse)(“10/27/2008 10:59 AM”);
AreEqual(下周日,GetSunday(DateTime.Parse)(“10/27/2008上午11:00”);
}
私人日期时间GetSunday(日期时间日期)
{
如果(date.DayOfWeek==DayOfWeek.Monday&&date.Hour<11)
返回日期.date.AddDays(-1);
while(date.DayOfWeek!=DayOfWeek.Sunday)
日期=日期。添加天数(1);
返回日期。日期;
}
我成功地使用了这些扩展:
如果你需要在周一上午11点之后开始新的一周,只需从现在减去11个小时,那么将该方法命名为其他方法可能是有意义的
DateTime GetRecordDate()
{
DateTime nowMinusOffset = DateTime.Now.AddHours(-11);
return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date;
}
星期天是星期天=0,星期一=1等等?@Joel:对不起,发得太快了。修订版应该行。谢谢,詹姆斯。我在返回行中添加了.Date,因此我只获取日期部分。关闭,但您将当前星期日转换为下一个星期日。
DateTime GetRecordDate()
{
DateTime nowMinusOffset = DateTime.Now.AddHours(-11);
return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date;
}