Как проверить, находится ли DateTime в определенном диапазоне

Я разрабатываю приложение для проката видео с использованием winforms C # и сталкиваюсь с проблемой, которую я, похоже, не могу написать или найти решение.

Программа должна проверять текущую дату и количество прошедших дней, а также диапазон между ними.

Если текущая дата меньше или равна указанной дате, она не рассчитает штрафную стоимость.

В противном случае, если дата сегодня уже прошла указанную дату, она рассчитает стоимость штрафа, умноженную на количество дней, прошедших между ними.

Вот пример кода, который я играю с идеей:

        DateTime db = DateTime.Parse(dateBeforeString);
        DateTime dt = DateTime.Now;

        var dateDiff = (dt - db);
        double totalDays = dateDiff.TotalDays;

        int totalPenalty = initialPenaltyInt*(int)Convert.ToInt64(totalDays);
        int totalCost = totalPenalty + rentalCostInt;

        if(DateTime.Now != db)
        {
            //do stuff here to:
            //check if current day is less than the one on the database
            //set total penalty to zero
        }
        else if(DateTime.Now > db)
        {
            //otherwise calculate the total penalty cost multipled by the number of days passed since a specific date
        }

c#,.net,winforms,

0

Ответов: 1


1 принят

Упрощенный, но может помочь вам прогрессировать, надеюсь:

public class Penalties
{
    // What about this choice of "int" (vs. decimal)?
    public virtual int ComputeOverdueDaysPenalty(int penaltyPerOverdueDay, DateTime dueDate)
    {
        // Work only with year, month, day, to drop time info and ignore time zone
        dueDate = new DateTime(dueDate.Year, dueDate.Month, dueDate.Day);
        var now = DateTime.Now;
        now = new DateTime(now.Year, now.Month, now.Day);
        return now > dueDate ? (int)now.Subtract(dueDate).TotalDays * penaltyPerOverdueDay : 0;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var penalties = new Penalties();

        var now = DateTime.Now;

        // due = today
        // should print 0
        Console.WriteLine(penalties.ComputeOverdueDaysPenalty(1234, new DateTime(now.Year, now.Month, now.Day)));

        // due = today plus 1
        var dueDate = now.AddDays(1);
        // should print 0 again
        Console.WriteLine(penalties.ComputeOverdueDaysPenalty(1234, dueDate));

        // due = today minus 1
        dueDate = dueDate.Subtract(new TimeSpan(48, 0, 0));
        // should print 1234
        Console.WriteLine(penalties.ComputeOverdueDaysPenalty(1234, dueDate));

        // due = today minus 2
        dueDate = dueDate.Subtract(new TimeSpan(24, 0, 0));
        // should print 2468
        Console.WriteLine(penalties.ComputeOverdueDaysPenalty(1234, dueDate));

        dueDate = DateTime.Parse("2016-10-02");
        // should print 12340, as of 10/12/2016
        Console.WriteLine(penalties.ComputeOverdueDaysPenalty(1234, dueDate));

        Console.ReadKey();
    }
}

Просто замечание:

Я считаю, что это немного странно, что вы решили использовать тип int в этом контексте, кстати.

Если ваши «штрафные» единицы фактически представляют собой некоторую валюту, рекомендуемый тип данных для этого является десятичным, в большинстве случаев использования.

'Надеюсь это поможет.

C # ,. сеть, WinForms,
Похожие вопросы