Dating
-
Check to see if the day defined by "year", "mon" and "day" is between dtStart and dtEnd:
if (year >= dtStart.Year && year <= dtEnd.Year && mon >= dtStart.Month && mon <= dtEnd.Month && day >= dtStart.Day && day <= dtEnd.Day) { ok = true; } else { ok = false; }
:(
He said, "Boy I'm just old and lonely, But thank you for your concern, Here's wishing you a Happy New Year." I wished him one back in return.
in order to fix the bugs, you could write:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(month==dtEnd.Month&&day>dtEnd.Day))))which still sits in the right forum. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
-
At first glance I thought it was just an awkward way to do it, as in why not just create a date from the MDY, then compare. Then I saw the real problem...
same happened to me, I just couldn't see what was wrong
-
Check to see if the day defined by "year", "mon" and "day" is between dtStart and dtEnd:
if (year >= dtStart.Year && year <= dtEnd.Year && mon >= dtStart.Month && mon <= dtEnd.Month && day >= dtStart.Day && day <= dtEnd.Day) { ok = true; } else { ok = false; }
:(
He said, "Boy I'm just old and lonely, But thank you for your concern, Here's wishing you a Happy New Year." I wished him one back in return.
Sadly, I've written code like that. :doh: Marc
-
in order to fix the bugs, you could write:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(month==dtEnd.Month&&day>dtEnd.Day))))which still sits in the right forum. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
Minor correction. Try:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(year==dtStart.Year&&month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(year==dtStart.Year&&month==dtEnd.Month&&day>dtEnd.Day))))Else you'll end up with 'valid' dates that are well within the month/date bracket, but in the wrong year(s)! hth :suss:
-
Minor correction. Try:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(year==dtStart.Year&&month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(year==dtStart.Year&&month==dtEnd.Month&&day>dtEnd.Day))))Else you'll end up with 'valid' dates that are well within the month/date bracket, but in the wrong year(s)! hth :suss:
I disagree. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
-
Check to see if the day defined by "year", "mon" and "day" is between dtStart and dtEnd:
if (year >= dtStart.Year && year <= dtEnd.Year && mon >= dtStart.Month && mon <= dtEnd.Month && day >= dtStart.Day && day <= dtEnd.Day) { ok = true; } else { ok = false; }
:(
He said, "Boy I'm just old and lonely, But thank you for your concern, Here's wishing you a Happy New Year." I wished him one back in return.
Remembers me to some date comparisons I have done with plain C - long ago :-O (but mine were at least correct :-)) I was very happy when I had to do it the first time with C# and found out I can do it like this:
DateTime dtPast = new DateTime(2009, 9, 9); DateTime dtNow = new DateTime(2010, 10, 10); DateTime dtFuture = new DateTime(2011, 11, 11); bool bIsBetween = dtNow > dtPast && dtNow < dtFuture;
-
Sadly, I've written code like that. :doh: Marc
Yes, but you only do it once, and then when you realize your blunder, you promise yourself to never go there again. Right? :D
-- Kein Mitleid Für Die Mehrheit
-
Yes, but you only do it once, and then when you realize your blunder, you promise yourself to never go there again. Right? :D
-- Kein Mitleid Für Die Mehrheit
Jörgen Sigvardsson wrote:
, you promise yourself to never go there again. Right?
Exactly. And generalizing the blunder, you realize how evil "if" statements actually are and carefully consider the use of them! Marc
-
Jörgen Sigvardsson wrote:
, you promise yourself to never go there again. Right?
Exactly. And generalizing the blunder, you realize how evil "if" statements actually are and carefully consider the use of them! Marc
I stopped using branches years ago. It's my way or the highway! :D
-- Kein Mitleid Für Die Mehrheit
-
in order to fix the bugs, you could write:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(month==dtEnd.Month&&day>dtEnd.Day))))which still sits in the right forum. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
Or (in no particular language):
long ymd = (year * 12 + month) * 31 + day
bool ok = ymd >= (dtStart.Year * 12 + dtStart.Month) * 31 + dtStart.Day
&& ymd <= (dtEnd.Year * 12 + dtEnd.Month) * 31 + dtEnd.DayThis is still in the right forum as it permits 31st Nov and 33rd Feb and 0th May, -9th day of the 17th month etc. without fixing them properly; but valid dates work. An even more horrible way with similar failings, but much faster would be (using
<<
as a shift left logical operator and|
as a bitwise OR):long ymd = year << 9 | month << 5 | day
bool ok = ymd >= (dtStart.Year << 9 | dtStart.Month << 5 | dtStart.Day)
&& ymd <= (dtEnd.Year << 9 | dtEnd.Month << 5 | dtEnd.Day)This assumes less than 32 days per month (2^5) and less than 16 months per year (2^4). The
year << 9 bits
areyear * 32 * 16
. So 33rd Feb and -9th day of the 17th month would be somewhat disasterous. -
Or (in no particular language):
long ymd = (year * 12 + month) * 31 + day
bool ok = ymd >= (dtStart.Year * 12 + dtStart.Month) * 31 + dtStart.Day
&& ymd <= (dtEnd.Year * 12 + dtEnd.Month) * 31 + dtEnd.DayThis is still in the right forum as it permits 31st Nov and 33rd Feb and 0th May, -9th day of the 17th month etc. without fixing them properly; but valid dates work. An even more horrible way with similar failings, but much faster would be (using
<<
as a shift left logical operator and|
as a bitwise OR):long ymd = year << 9 | month << 5 | day
bool ok = ymd >= (dtStart.Year << 9 | dtStart.Month << 5 | dtStart.Day)
&& ymd <= (dtEnd.Year << 9 | dtEnd.Month << 5 | dtEnd.Day)This assumes less than 32 days per month (2^5) and less than 16 months per year (2^4). The
year << 9 bits
areyear * 32 * 16
. So 33rd Feb and -9th day of the 17th month would be somewhat disasterous.the shifting way is what I would actually do when DateTime were not available; with a little optimization:
int ymd = (((year<<4)+month)<<5)+day;
eyc.IMO it is the cheapest mapping from dates to integers that supports chronological ordering. I do add parentheses, for readability if nothing else. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
-
in order to fix the bugs, you could write:
ok=!(year<dtStart.Year||(year==dtStart.Year&&(month<dtStart.Month||(month==dtStart.Month&&day<dtStart.Day)))||
year>dtEnd.Year||(year==dtEnd.Year&&(month>dtEnd.Month||(month==dtEnd.Month&&day>dtEnd.Day))))which still sits in the right forum. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
DateTime dt = new DateTime(year, month, day);
return (dt <= dtEnd & dt >= dtStart);How about this one? Enclosing it in try catch will cop with invalid dates too.