坚持检查闰年和有效日期
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
我写这段代码是为了检查日期验证,但我对如何检查闰年一头雾水。
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