Problem in finding correct date.

2 次查看(过去 30 天)
I am writting a code to see whether a particular date is valid or not. The function takes three positive integer scalar inputs. If it is a valid date it returns true or else false.
When I try to use the following code in the command window
valid = valid_date(2018,4,1)
valid = valid_date(2018,4,31)
It returns false for both the cases. However it should return true for the first case and false for the second case.
My code is as follows
function valid = valid_date(year,month,day)
if ~isscalar(year) ||~isscalar(month) || ~isscalar(day);
valid = false;
else
valid = true;
end
if year<1 || month<1 || day<1;
valid = false;
else
valid = true;
end
if month==4||month==6||month==9||month==11 && day<=30
valid = true;
else
valid = false;
end
if month==1||month==3||month==5||month==7||month==8||month==10||month==12 && day<=31
valid = true;
else
valid = false;
end
  1 个评论
Om Yadav
Om Yadav 2020-4-25
Your if else is creating problem. You assigning 0 or 1 in each if condition. Ultimately, only last assigment survives. Let me give you an example of this. You just put your month==4 condition in the end and you will get the answer correct for months 4,6,9,11 and incorrect for others.
Suggestion is, only give condition and assignment. And else in the last loop like
function valid = valid_date(year,month,day)
if ~isscalar(year) ||~isscalar(month) || ~isscalar(day)
valid = false;
end
if year<1 || month<1 || day<1
valid = false;
end
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) && day<=31
valid = true;
end
if (month==4||month==6||month==9||month==11) && day<=30
valid = true;
else
valid=false;
end
But again Feb is problem so I am highlighting where you are faulting.

请先登录,再进行评论。

回答(2 个)

Ameer Hamza
Ameer Hamza 2020-4-25
编辑:Ameer Hamza 2020-4-25
Try this simpler version
function tf = valid_date(y, m, d)
[Y,M,D] = ymd(datetime(y, m, d));
tf = all([Y M D] == [y m d]);
end
Result
>> valid_date(2018,4,1)
ans =
logical
1
>> valid_date(2018,4,31)
ans =
logical
0

Kulko Margarita
Kulko Margarita 2021-2-12
function isvalid = valid_date(y, m, d)
% Check if the inputs are valid
% Check that they are scalars
if ~(isscalar(y) && isscalar(m) && isscalar(d))
isvalid = false;
% Check that inputs are positive
elseif ~all([y, m, d] > 0)
isvalid = false;
% Check that inputs are integers (not the data type)
elseif any(rem([y, m, d], 1))
isvalid = false;
% Check that m and d are below the max possible
elseif (m > 12) || (d > 31)
isvalid = false;
% The inputs could be a valid date, let's see if they actually are
else
% Vector of the number of days for each month
daysInMonth = [31 28 31 30 31 30 31 31 30 31 30 31];
% If leap year, change days in Feb
if isequal(rem(y, 4), 0) && (~isequal(rem(y, 100), 0) || isequal(rem(y, 400), 0))
daysInMonth(2) = 29;
end
maxDay = daysInMonth(m);
if d > maxDay
isvalid = false;
else
isvalid = true;
end
end
end

类别

Help CenterFile Exchange 中查找有关 Dates and Time 的更多信息

标签

产品


版本

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by