Определение принадлежности даты диапазону времени

Задача

 

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

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

 

Решение

 

Задачу можно решить как минимум двумя способами. Например, для каждой даты вычислить количество дней, прошедших с какой-нибудь начальной даты (например, нулевого года). После чего сравнить полученные значения. Если количество дней анализируемой даты будет находиться между двумя другими, то дата принадлежит диапазону.

Второй, более простой, способ это «поэлементное» сравнение дат: сначала сравниваются года, если этого недостаточно, то месяцы и, затем, дни. Ниже приводится пример реализации этого способа. Однако тут тоже могут быть варианты.

Программа на языке Паскаль: 

 

type date = record
        year:integer;
        month:1..12;
        day:1..31;
     end;
 
var d1, d2, dmy: date;
 
begin
    with d1 do begin
        year := 1990;
        month := 5;
        day := 15
    end;
    with d2 do begin
        year := 2005;
        month := 12;
        day := 25
    end;
 
    write('Год: ');
    readln(dmy.year);
    write('Месяц: ');
    readln(dmy.month);
    write('День: ');
    readln(dmy.day);
 
    if (dmy.year > d1.year) and (dmy.year < d2.year) then
        writeln('Yes');
 
    if dmy.year = d1.year then
        if dmy.month > d1.month then
            writeln('Yes')
        else
            if dmy.month = d1.month then
                if dmy.day > d1.day then
                    writeln('Yes');
 
    if dmy.year = d2.year then
        if dmy.month < d2.month then
            writeln('Yes')
        else
            if dmy.month = d2.month then
                if dmy.day < d2.day then
                    writeln('Yes');
 
readln
end.

 

Комментарии

type
  data = record
    year: integer;
    moynt: 1..12;
    day: 1..31;
  end;
 
var
  d1, d2, d3: data;
 
begin
  randomize;
  with d1 do 
  begin
    year := random(2019);
    moynt := random(11) + 1;
    day := random(30) + 1;
  end;
  with d2 do 
  begin
    year := random(2019);
    moynt := random(11) + 1;
    day := random(30) + 1;
  end;
  writeln(d1);
  writeln(d2);
  writeln('Введите год: ');
  read(d3.year);
  writeln('Введите месяц: ');
  read(d3.moynt);
  writeln('Введите день: ');
  read(d3.day);
 
  if (d2.year > d1.year) then begin
    if (d3.year > d1.year) and (d3.year < d2.year) then 
      writeln('Дата попала в интервал')
    else
    begin
      if (d3.year = d1.year) then 
      begin
        if (d3.moynt >= d1.moynt) then
          if (d3.day >= d1.day) then
            write('Дата попала в интервал')
          else 
            writeln('Дата не попала в интервал')
      end
        else
      begin
        if (d3.year = d2.year) then
          if (d3.moynt <= d2.moynt) then
            if (d3.day <= d2.day) then
              write('Дата попала в интервал')
            else 
              writeln('Дата не попала в интервал')
      end
    end
  end
  else
  begin
    if (d3.year < d1.year) and (d3.year > d2.year) then 
      writeln('Дата попала в интервал')
    else
    begin
      if (d3.year = d1.year) then 
      begin
        if (d3.moynt <= d1.moynt) then
          if (d3.day <= d1.day) then
            write('Дата попала в интервал')
          else 
            writeln('Дата не попала в интервал')
      end
        else
      begin
        if (d3.year = d2.year) then
          if (d3.moynt >= d2.moynt) then
            if (d3.day >= d2.day) then
              write('Дата попала в интервал')
            else 
              writeln('Дата не попала в интервал')
      end
    end
  end
 
  { if (d2.year >= d1.year) then begin
  if (d3.year >= d1.year) and (d3.year <= d2.year) then begin
  if (d3.moynt >= d1.moynt) and ((d3.moynt <= d2.moynt)) then
  if (d3.day >= d1.day) and (d3.day <= d2.day) then
  write('Дата попала в интервал')
  end
  else writeln('Дата не попала в интервал')
  end 
  else
  begin
  if (d3.year <= d1.year) and (d3.year >= d2.year) then begin
  if (d3.moynt <= d1.moynt) then
  if (d3.day <= d1.day) then
  write('Дата попала в интервал')
  end
  else writeln('Дата не попала в интервал')
  end;}
end.