Member 13081540 Ответов: 1

Добавленное или вычитаемое значение приводит к непредставимой дате-времени.\r\nparameter name: месяцы


Привет,

Я столкнулся с ошибкой, как говорится в названии, и не могу понять, что эта ошибка означает. Может, кто-нибудь объяснит?

Исключение: "добавленное или вычитаемое значение приводит к непредставимому DateTime.\r\nParameter name: months"

Спасибо.

Что я уже пробовал:

Мои даты принимают только дату, то есть dateTimePicker.Ценность.Дата, так что я подумал, что это проблема, которую я не добавил .Дата везде, где я использую даты, но это не помогло.

DateTime twoYearsAgo = policy.startDateOfThePolicy.AddYears(-2);
DateTime fiveYearsAgo = policy.startDateOfThePolicy.AddYears(-5);

foreach (var driver in policy.Drivers)
 {
 if (driver.Claims.Any(claim => claim.ClaimDate.Date >=             policy.startDateOfThePolicy.AddYears(-1).Date))
 {
     policy.Premium = policy.Premium + (policy.Premium + 10);
 }
 else if(driver.Claims.Any(claim => claim.ClaimDate.Date <= twoYearsAgo.Date && claim.ClaimDate.Date >= fiveYearsAgo.Date))
 {
     policy.Premium = policy.Premium + (policy.Premium + 10);
 }


Policy-это класс, который содержит переменную premium, а также список драйверов policy.Водители

Класс Водителя:
<public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }
        public string Occupation { get; set; }
        public List<Claim> Claims { get; set; } = new List<Claim>();


Класс претензий:
public class Claim
    {
        public DateTime ClaimDate { get; set; }
    }


Класс Политики:

public class Policy
   {
       private decimal premium = 100;

       public List<Driver> Drivers { get; set; } = new List<Driver>();

       public DateTime startDateOfThePolicy { get; set; }

       public decimal Premium
       {
           get { return premium; }
           set { premium = value; }
       }
   }

CHill60

Мы не сможем вам помочь, если вы не опубликуете свой код
Спасибо за код. Когда вы используете отладчик и ставите точку останова в строке, которая дает исключение, каково значение в startDateOfThePolicy в это время?
Если вы не уверены в отладке, то прочтите это: Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Member 13081540

дата начала политики-01/01/0001 00: 00:00

1 Ответов

Рейтинг:
11

OriginalGriff

Сообщение об ошибке означает, что при добавлении или вычитании значения из вашей даты результат выходит за пределы значения .NET DateTime: с 00:00:00.0000000 UTC, 1 января 0001 по 23:59:59.9999999 UTC, 31 декабря 9999 (оба в григорианском календаре).
Предположим, что значение, с которого вы начинаете, равно нулю - 00:00:00.0000000 UTC, 1 января 0001 года, - и вы вычли из него любое ненулевое значение.

Используйте отладчик и посмотрите, что именно находится в нем. policy.startDateOfThePolicy когда ваш код выполняется. Если это то, что я подозреваю, то вам нужно выяснить, почему - и это не в коде, который вы показываете, так как вы ни в какой момент в этом коде не меняете значение!


Member 13081540

политики.значение startDateOfThePolicy выглядит так: 01/01/0001 00:00:00.

Я думаю, что я меняю значение, в моей основной форме, вот так:

Политика dateOfThePolicy = новая политика();
dateOfThePolicy.startDateOfThePolicy = dtpPolicy.Ценность;

OriginalGriff

Ну ... ясно же, что значение в вашем ДТП не задано!
Это правильный ДТП? Вы дали ему значение откуда-то, из базы данных или что-то в этом роде?

Member 13081540

Да, это правильный выбор даты и времени, и нет, я не давал vlue из базы данных. Правильно ли я понимаю, что мне нужно установить значение DTP, прежде чем я нажму кнопку, чтобы добавить к нему новое значение?

OriginalGriff

Нет-при создании DTP он инициализируется текущей датой и временем, даже если вы его не отображаете. А минимальное значение DTP - 1753 год (начало григорианского календаря).
Таким образом, предположительно, ваш код, устанавливающий его в значение DTP, не используется. Что скажет отладчик, если вы поставите точку останова на этой строке?

Member 13081540

А, нашел проблему. Мне нужно было сделать это именно так,
политика.StartDateOfThePolicy = dtpPolicy.Ценность;

OriginalGriff

:смеяться:
Я тоже так делаю: читаю то, что хотел написать, а не то, что сделал на самом деле...

Member 13081540

: Д-да. В любом случае, спасибо за помощь, вы мне очень помогли, теперь я понимаю, что означает эта ошибка. :)

OriginalGriff

Пожалуйста!