Как вы выполняете округление в конце недели в поле даты в C # (без использования LINQ)? - PullRequest
2 голосов
/ 27 октября 2008

У меня странная проблема с округлением дат, которую, надеюсь, кто-то сможет решить. Мой клиент использует рабочую неделю с понедельника по воскресенье. Дата воскресенья считается концом недели и используется для идентификации всех записей, введенных за определенную неделю (поэтому все, что было введено на прошлой неделе, будет иметь значение WEEKDATE '10/26/2008', то есть дата воскресенья). *

Один небольшой поворот состоит в том, что пользователи вводят записи за предыдущую неделю до 11 часов утра в понедельник текущей недели.

Так что мне нужна функция, которая начинается с DateTime.Now и возвращает дату окончания недели (без временной части) в соответствии с правилами, приведенными выше. Спасибо за вашу помощь. У меня есть решение, которое работает, но я слишком смущен, чтобы опубликовать его.

О, и я не могу использовать LINQ.

Ответы [ 4 ]

4 голосов
/ 27 октября 2008

Это также относится и к мне:

[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;
}
4 голосов
/ 27 октября 2008
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 голос
/ 27 октября 2008
DateTime GetMidnightFollowingSunday()
{
    DateTime now = DateTime.Now;
    return now.AddDays(7 - (int)now.DayOfWeek).Date;
}

Если вам нужно начать новую неделю после 11:00 утра понедельника, просто вычтите 11 часов, но тогда, вероятно, имеет смысл назвать метод как-то еще.

DateTime GetRecordDate()
{
    DateTime nowMinusOffset = DateTime.Now.AddHours(-11);
    return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date;
}
0 голосов
/ 27 октября 2008

Я использовал эти расширения с большим успехом:

http://www.codeplex.com/DateTimeExtensions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...