坚持检查闰年和有效日期

Stuck on checking for leap year and a valid date

我写这段代码是为了检查日期验证,但我对如何检查闰年一头雾水。

date = '01/02/1990';
display('hello')
a=strsplit(date,'/');
day = a(1);
display(day);

%b=strsplit('/',date,'/');
month = a(2);
display(month);

%c=strsplit('/','/',date);
year = a(3);
display(year);

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
    if (day>=1&&day<=31)

        display(' Its a valid date')
    else
        display(' Its NOT a valid date')
    end
end 

如何合并闰年计算?

感谢@gregswiss 指出我计算闰年的错误。这直接将检查合并到代码中,因此您不必包含闰年的先验列表:

if (mod(year,4) == 0 && mod(year,100) ~= 0) || mod(year,400) == 0
     disp('Leap year'); 
else
     disp('Non-leap year'); 
end

只需将其包含在您的 if 声明中,就像您检查月份一样。那么如果你的年份在 LeapYear 中有相应的条目,那么它就是闰年:

if sum(year==LeapYear)
    disp('This is a leap year')
end

求和的原因是 year==LeapYear 将是一个包含 30 个值的逻辑数组,如果您的 year 确实是闰年,则其中 29 个零和 1 个一,否则它将包含30个零。 我最近发现了一个更晦涩的函数:eomday 它告诉你这个月的最后一天,所以一个简单的 eomday(year,month)==29 就足以告诉你它是否是闰年。 (还有 [leapyear][2],但那是在航空航天工具箱中)

    date = input('Please enter a date in the DD/MM/YYYY format ','s')
    display('hello')
    tmp=strsplit(date,'/');
    a(1) = str2num(tmp{1}); % Create an array out of your string
    a(2) = str2num(tmp{2});
    a(3) = str2num(tmp{3});
    day = a(1);
    display(day);

     month = a(2);
     display(month);

    year = a(3);
    display(year);
    if eomday(year,month)==29
         disp('Leap year'); 
    else
         disp('Non-leap year'); 
    end
    %if (mod(year,4) == 0 & mod(year,100) ~= 0) | mod(year,400) == 0
    %     disp('Leap year'); 
    %else
    %     disp('Non-leap year'); 
    %end
      if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
       if (day>=1&&day<=31)

         display(' It is a valid date')
   else
         display(' It is NOT a valid date')
           end
       end

根据 Gregorian calendar rules 闰年的正确测试是:

if (mod(year,4) == 0 & mod(year,100) ~= 0) | mod(year,400) == 0
     disp('Leap year'); 
else
     disp('Non-leap year'); 
end

您可以考虑将测试包装在函数 'isLeap' 或类似的东西中...

使用 datetime 函数可以使代码更健壮和更简单,该函数将处理解析并在日期无效时抛出错误

date = '01/02/1990';
try
   d = datetime(date, 'InputFormat', 'dd/MM/yyyy');
   % access day, month, year using: d.Day, d.Month and d.Year...
   % ...
   disp(' Its a valid date')
catch 
   disp(' Its NOT a valid date')
end