Code Cleanup

- Remove the code related to the format "day of year" (number of day starting
  from the January 1) as mktime does not allow to specify it with the field
  tm_yday.
- Cleaner check of the date (everything is done by Date::valid).
- Correct hour, minute and second is also checked.
This commit is contained in:
Louis-Claude Canon 2012-07-30 16:31:21 +02:00 committed by Paul Beckingham
parent b5cd5ea188
commit 384be4b249
4 changed files with 20 additions and 22 deletions

View file

@ -339,7 +339,7 @@ bool Date::valid (const int d, const int y)
if (y < 0) if (y < 0)
return false; return false;
if (d < 0 || d > 365) if (d < 1 || d > Date::daysInYear (y))
return false; return false;
return true; return true;
@ -371,6 +371,12 @@ int Date::daysInMonth (int month, int year)
return days[Date::leapYear (year) ? 1 : 0][month - 1]; return days[Date::leapYear (year) ? 1 : 0][month - 1];
} }
////////////////////////////////////////////////////////////////////////////////
int Date::daysInYear (int year)
{
return Date::leapYear (year) ? 366 : 365;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
std::string Date::monthName (int month) std::string Date::monthName (int month)
{ {

View file

@ -67,6 +67,7 @@ public:
static time_t easter (int year); static time_t easter (int year);
static bool leapYear (int); static bool leapYear (int);
static int daysInMonth (int, int); static int daysInMonth (int, int);
static int daysInYear (int);
static std::string monthName (int); static std::string monthName (int);
static void dayName (int, std::string&); static void dayName (int, std::string&);
static std::string dayName (int); static std::string dayName (int);

View file

@ -734,7 +734,7 @@ bool Nibbler::getDate (const std::string& format, time_t& t)
{ {
case 'm': case 'm':
if (i + 2 <= _length && if (i + 2 <= _length &&
(_input[i + 0] == '0' || _input[i + 0] == '1') && isdigit (_input[i + 0]) &&
isdigit (_input[i + 1])) isdigit (_input[i + 1]))
{ {
month = atoi (_input.substr (i, 2).c_str ()); month = atoi (_input.substr (i, 2).c_str ());
@ -882,7 +882,7 @@ bool Nibbler::getDate (const std::string& format, time_t& t)
case 'h': case 'h':
if (i + 2 <= _length && if (i + 2 <= _length &&
(_input[i + 0] == '0' || _input[i + 0] == '1') && isdigit (_input[i + 0]) &&
isdigit (_input[i + 1])) isdigit (_input[i + 1]))
{ {
hour = atoi (_input.substr (i, 2).c_str ()); hour = atoi (_input.substr (i, 2).c_str ());
@ -1019,27 +1019,15 @@ bool Nibbler::getDate (const std::string& format, time_t& t)
minute = (minute == -1) ? 0 : minute; minute = (minute == -1) ? 0 : minute;
second = (second == -1) ? 0 : second; second = (second == -1) ? 0 : second;
// Check that values are correct
if (! Date::valid (month, day, year, hour, minute, second))
return false;
// Convert to epoch. // Convert to epoch.
struct tm tms = {0}; struct tm tms = {0};
tms.tm_isdst = -1; // Requests that mktime determine summer time effect. tms.tm_isdst = -1; // Requests that mktime determine summer time effect.
tms.tm_mon = month - 1;
if (month == 0 && day >= 0 && day <= 365) tms.tm_mday = day;
{
tms.tm_yday = day;
tms.tm_mon = 0;
if (! Date::valid (day, year))
return false;
}
else
{
tms.tm_mday = day;
tms.tm_mon = month > 0 ? month - 1 : 0;
if (! Date::valid (month, day, year))
return false;
}
tms.tm_year = year - 1900; tms.tm_year = year - 1900;
tms.tm_hour = hour; tms.tm_hour = hour;
tms.tm_min = minute; tms.tm_min = minute;

View file

@ -35,7 +35,7 @@ Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv) int main (int argc, char** argv)
{ {
UnitTest t (177); UnitTest t (179);
try try
{ {
@ -86,6 +86,9 @@ int main (int argc, char** argv)
t.ok (Date::valid ("2/29/2008"), "valid: 2/29/2008"); t.ok (Date::valid ("2/29/2008"), "valid: 2/29/2008");
t.notok (Date::valid ("2/29/2007"), "invalid: 2/29/2007"); t.notok (Date::valid ("2/29/2007"), "invalid: 2/29/2007");
t.ok (Date::valid (366, 2008), "valid: 366 days in 2008");
t.notok (Date::valid (366, 2007), "invalid: 366 days in 2007");
// Time validity. // Time validity.
t.ok (Date::valid (2, 28, 2010, 0, 0, 0), "valid 2/28/2010 0:00:00"); t.ok (Date::valid (2, 28, 2010, 0, 0, 0), "valid 2/28/2010 0:00:00");
t.ok (Date::valid (2, 28, 2010, 23, 59, 59), "valid 2/28/2010 23:59:59"); t.ok (Date::valid (2, 28, 2010, 23, 59, 59), "valid 2/28/2010 23:59:59");