0

我编写了这段代码来检查日期验证,但我被困在如何检查闰年。

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 

如何合并闰年计算?

4

3 回答 3

2

根据公历规则,闰年的正确测试是:

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

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

于 2015-09-14T04:15:31.613 回答
1

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
于 2015-09-14T13:56:39.427 回答
1

感谢@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 个值的逻辑数组,其中 29 个零和 1 个如果您year确实是闰年,或者它将包含 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
于 2015-09-13T19:28:41.773 回答