MATLAB Answers

How to write a function to determine if a date entered is valid

593 views (last 30 days)
Elliot Ogbechina
Elliot Ogbechina on 28 Dec 2019
Commented: Walter Roberson on 17 Jul 2020 at 6:55
I am to Write a function called valid_date that takes three positive integer scalar inputs year, month, day. If these three represent a valid date, return a logical true, otherwise false. The name of the output argument is valid. If any of the inputs is not a positive integer scalar, return false as well. Here is the code i have tried but keeps returning true for all dates, I have editted it a lot and now i just need a fresh eye to point out what i am doing wrong:
NB: I am not to use any built in MatLab function.
function valid = valid_date (year, month, date)
if (nargin==3)
valid=true;
elseif (isinteger(year)) && year>0 && (isscalar(year))
valid=true;
elseif (isinteger(month))&& month>0 && month <=12 && (isscalar(month))
valid=true;
elseif (isinteger(date)) && date > 0 && (isscalar(date))
valid=true;
elseif (month==1||month==3||month==5||month==7||month==8||month==10||month==12)&& date<=31
valid=true;
elseif date <=30
valid=true;
elseif (isinteger(year/4)) && month == 2 && (~(isinteger(year/100))||(isinteger(year/400))) && date <= 29
valid=true;
else
valid = false;
end

  9 Comments

Show 6 older comments
Walter Roberson
Walter Roberson on 31 Dec 2019
TF = isinteger(A) returns logical 1 (true) if A is an array of integer type. Otherwise, it returns logical 0 (false).
Not integer value, integer type
Stephen Cobeldick
Stephen Cobeldick on 31 Dec 2019
"so what can i use in place of isinteger"
Take a look at this answer you were given six hours ago:
Does it use isinteger? (hint: no)
What does it use? (hint: mod)
Also read my comment following that answer.

Sign in to comment.

Answers (5)

aniket GIRI
aniket GIRI on 27 May 2020
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

  0 Comments

Sign in to comment.


MUHAMMAD USMAN BIN AHMED
MUHAMMAD USMAN BIN AHMED on 1 Jun 2020
function valid = valid_date(year,month,day)
if nargin ~=3
valid=false;
elseif ((~isscalar(year))||(mod(year,1)~=0)||year<=0)
valid=false;
elseif ((~isscalar(month))||(mod(month,1)~=0)||month<=0||month>12)
valid=false;
elseif ((~isscalar(day))||(mod(day,1)~=0)||day<=0)
valid=false;
elseif (any(month==[1,3,5,7,8,10,12]) && day>31)
valid=false;
elseif (any(month==[4,6,9,11]) && day>30)
valid=false;
else
valid=true;
if (rem(year,4)==0 && month==2 && day<=29)
valid=true;
if (rem(year,100)==0)
valid=false;
if rem(year,400)==0
valid=true;
return
end
end
elseif month==2 && day>28
valid=false;
end
end
end

  4 Comments

Show 1 older comment
Walter Roberson
Walter Roberson on 1 Jun 2020
if (rem(year,4)==0 && month==2 && day<=29)
valid=true;
if (rem(year,100)==0)
valid=false;
No, that would declare (for example) February 15 1900 to be invalid. rem(year,4) would be 0, month would be 2, day <= 29 would be true, so you would set valid true, but then you test rem(year,100)=0 which would be true so you would set valid = false. Then rem(year,400) would not be 0 so you would leave valid false. Then since you found true on the year/month/day test you would not execute the elseif so valid will still be false. Then you would return, with valid still false.
MUHAMMAD USMAN BIN AHMED
MUHAMMAD USMAN BIN AHMED on 1 Jun 2020
function valid = valid_date_2(year,month,day)
if nargin ~=3
valid=false;
elseif ((~isscalar(year))||(mod(year,1)~=0)||year<=0)
valid=false;
elseif ((~isscalar(month))||(mod(month,1)~=0)||month<=0||month>12)
valid=false;
elseif ((~isscalar(day))||(mod(day,1)~=0)||day<=0)
valid=false;
elseif (any(month==[1,3,5,7,8,10,12]) && day>31)
valid=false;
elseif (any(month==[4,6,9,11]) && day>30)
valid=false;
else
valid=true;
if (rem(year,4)==0 && month==2 && day<=29)
valid=true;
if ((rem(year,100)==0)&& day>28)
valid=false;
if (rem(year,400)==0 && day<=29)
valid=true;
return
end
end
elseif month==2 && day>28
valid=false;
end

Sign in to comment.


Jalaj Gambhir
Jalaj Gambhir on 31 Dec 2019
Hi,
You can try the following function and see if it works for you:
function valid = valid_date(year, month, date)
if(nargin ~= 3)
valid = false;
elseif (~(mod(year,1)==0) || (year<0) || ~isscalar(year))
valid = false;
elseif (~(mod(month,1)==0) || (month<=0) || (month>12) || ~isscalar(month))
valid = false;
elseif (~(mod(date,1)==0) || (date<=0) || ~isscalar(date))
valid = false;
elseif( (month==1||month==3||month==5||month==7||month==8||month==10||month==12)&& date>31 )
valid = false;
elseif ((month==4||month==6||month==9||month==11) && date>30)
valid = false;
elseif(~leapyear(year) && month==2 && date>28)
valid=false;
elseif(leapyear(year) && month==2 && date>29)
valid=false;
else
valid = true;
end

  6 Comments

Show 3 older comments
Elliot Ogbechina
Elliot Ogbechina on 31 Dec 2019
Thanks a lot. That was really a nice way to work around it.
This is the final code and everything worked.
function valid = valid_date(year, month, date)
if(nargin ~= 3)
valid = false;
elseif ((~isscalar(year)||(mod(year,1)~=0) || year<0))
valid = false;
elseif ((~isscalar(month))||(mod(month,1)~=0) || (month<=0) || (month>12))
valid = false;
elseif ((~isscalar(date))||(mod(date,1)~=0) || (date<=0))
valid = false;
elseif(any(month==[1:2:7,8:2:12])&& date>31)
valid = false;
elseif (any(month==[4,6,9,11]) && date>30)
valid = false;
elseif month==2 && date>(28+(mod(year,400)==0 || (mod(year,100)~=0 && mod(year,4)==0)))
valid=false;
else
valid = true;
end
Thanks a lot once again.
Walter Roberson
Walter Roberson on 1 Jun 2020
Anil Muradiya which code are you finding is failing, and what inputs are you finding that it is failing on?

Sign in to comment.


Ujjawal Barnwal
Ujjawal Barnwal on 7 Jun 2020
function valid=valid_date(year,month,day)
if ~isscalar(year) || year<1 || year~=fix(year) || ~isscalar(month) || month<1 || month>12 || month~=fix(month) || ~isscalar(day) || day<1 || day~=fix(day)
valid=false;
else
a=0;
if rem(year,100)==0
if rem(year,400)==0
a=1;
end
elseif rem(year,4)==0
a=1;
end
if month==2 && a==1
valid=(day<=29);
elseif month==2 && a==0
valid=(day<=28);
elseif sum([month]==[1 3 5 7 8 10 12])
valid=(day<=31);
elseif sum([month]==[4 6 9 11])
valid=(day<=30);
else
valid=false;
end
end

  0 Comments

Sign in to comment.


Sravani Kurma
Sravani Kurma on 17 Jul 2020 at 5:12
Edited: Sravani Kurma on 17 Jul 2020 at 5:37
function valid=valid_date(year,month,date)
if nargin == 3;
if ~isscalar(year) || year<1|| year~=fix(year)||~isscalar(month) || month<1|| month~=fix(month)||~isscalar(date) || date<1|| date~=fix(date);
valid=false;
else
if ((year/100)~=fix(year/100)&&(year/4)==fix(year/4))||((year/400)==fix(year/400));
%leap yr
valid=mmm(month,date);
else
%non leap year
valid=sss(month,date);
end
end
end
function valid=mmm(month,date)
m30=[4,6,9,11];
m31=[1,3,5,7,8,10,12];
m29=2;
m28=2;
if max((month==m31)')==1
valid=(date>=1)&&date<=31;
elseif max(( month==m30)')==1
valid=(date>=1)&&date<=30;
elseif max((month==m29)')==1
valid=(date>=1)&&date<=29;
else
valid=false;
end
function valid=sss(month,date)
m30=[4,6,9,11];
m31=[1,3,5,7,8,10,12];
m29=2;
m28=2;
if max((month==m31)')==1
valid=(date>=1)&&date<=31;
elseif max(( month==m30)')==1
valid=(date>=1)&&date<=30;
elseif max((month==m28)')==1
valid=(date>=1)&&date<=28;
else
valid=false;
end

  1 Comment

Walter Roberson
Walter Roberson on 17 Jul 2020 at 6:55
What will your code return if nargin is not 3?
if max((month==m31)')==1
Hint: any()

Sign in to comment.


Translated by