Как получить предыдущую дату с помощью DayOfWeek?

#c# #asp.net #datetime

#c# #asp.net #дата и время

Вопрос:

В моей базе данных есть таблица напоминаний, в которой есть 2 столбца для хранения ActionDay и ReminderDay. Оба эти дня хранятся в виде целых чисел: 0 (вс) -> 6 (сб) для представления дней недели.

Когда я загружаю свою страницу, я хотел бы показать дату следующего дня действия и дату дня напоминания.

Я могу определить дату следующего дня действия, используя это:

 public static class DateTimeExtensions
{
    public static DateTime Next(this DateTime date, DayOfWeek weekday)
    {
        return (from i in Enumerable.Range(0, 7)
                where date.AddDays(i).DayOfWeek == weekday
                select date.AddDays(i)).First();

    }
}
  

У меня возникли некоторые проблемы с вычислением предыдущей даты из ActionDay.

Например, (используя сегодняшнюю дату 26 октября 2011 года): если ActionDay равен ‘3’, а ReminderDay равен ‘2’, тогда я ожидаю ‘Ср, 26 октября’ для ActionDay и ‘Вт, 25 октября’ для ReminderDay.

Если ActionDay равен 0, а ReminderDay равен 6, я бы ожидал ‘Sun, 30 Oct’ и ‘Sat, 29 Oct’

Любые предложения о том, как я мог бы получить эту дату напоминания? Мне также было бы интересно узнать, есть ли какие-либо хорошие расширения / фрагменты c # datetime, поскольку, возможно, было бы проще подключить что-то, что кто-то еще протестировал, чем писать здесь свое собственное 🙂

Спасибо, Рич

Комментарии:

1. Вы изучали это: code.google.com/p/noda-time Это довольно мощная библиотека, которая может решить некоторые из ваших проблем.

2. Моим единственным советом было бы не использовать вычисления на основе 0 для метода, основанного на дате. Воскресенье должно быть 1 …. Суббота должна быть 7

3. Какая-либо конкретная причина для этого Ramhound?

Ответ №1:

Вы можете вычислить разницу между днем действия и днем напоминания, а затем вызвать AddDay() функцию для даты и времени, представляющих день действия, чтобы получить дату и время для дня напоминания:

 // here a stands for the number representing the action day, and r for the reminder day
// a and r are both integers from 0 to 6
int diff;
if (a >= r)
{
    diff = a - r;
}
else
{
    diff = a   7 - r;
}

DateTime reminderDateTime = actionDateTime.AddDays(-1 * diff);
  

Комментарии:

1. Спасибо за помощь, Андрей. Я подключил это к классу, и теперь он отлично работает 🙂