Найти повторяющуюся дату, ближайшую к сегодняшнему дню - C # - PullRequest
2 голосов
/ 14 января 2012

Звучит как домашнее задание? нет, это не так. Я разработал логику для этого, но не такую ​​эффективную, когда даты охватывают годы. Вот как это должно работать,

StartDate: 1/1/2012

FinishDate: 1/10/2012 

RecurringInterval: 2 ( In days)

Вывод будет:

1/6/2012, если сегодняшняя дата (Date.Now) равна 1/5/2012 (в предположении формата MM/dd/yyyy). Проверка закончится, когда будет достигнута дата окончания. Если в течение данного периода времени не найдено ни одной даты, должна быть возвращена сегодняшняя Дата Очень простой, но не эффективный.

Что с этим не так?

if (!_isRecurring)
    return DateTime.UtcNow;
DateTime initialDate = _startDate;
DateTime finalDate = _finishDate;
int recurringDays = _recurringInteral;
/*
 * start Date + recurring interval falls between start date and finishdate then get its date
 */
do
{
    //add recurring day to start date
    initialDate = initialDate.AddDays(recurringDays);
    //check if it falls in between start days and end days
     if(initialDate  <= finalDate)
    break;            
} while (initialDate <= finalDate);
//return the first occurance of the recurring day
return initialDate;

1 Ответ

8 голосов
/ 14 января 2012

Немного арифметики должно спасти день (каламбур):

var start = new DateTime(2012, 1, 1);
var end = new DateTime(2012, 10, 1);
var interval = 2; // days

var today = DateTime.Today;
var diff = (int)((today - start).TotalDays);
var mod = diff % interval;
var correction = TimeSpan.FromDays((mod > interval / 2 ? interval : 0) - mod);
var result = today + correction > end ? today : today + correction;
Console.Out.WriteLine("Result is: {0}", result);

увидеть это в действии .

Что это делаетэто вычислить, сколько дней от «места повторения» сегодня (переменная mod).Это, очевидно, будет число> = 0 и <интервал.Если он составляет половину интервала или меньше, это означает, что ближайшая точка повторения находится раньше, чем сегодня, и в этом случае вычтите <code>mod дней с сегодняшнего дня, чтобы найти точку.Если он больше половины интервала, это означает, что нам нужно добавить interval - mod дней, чтобы найти точку (которая будет в будущем).

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