Enhancement
- Undefined variables are put to today in dates (if year and month is not specified, the current ones are considered). But if a global ones is specified, lower one are put to their default values (0 or 1).
This commit is contained in:
committed by
Paul Beckingham
parent
d623a6f9af
commit
ee0a16f663
@@ -564,6 +564,22 @@ a D b Y H:N:S would do an output as "Mon 24 Jan 2011 11:19:42"
|
|||||||
.RE
|
.RE
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
|
.RS
|
||||||
|
Undefined fields are put to their minimal valid values (1 for month and day and
|
||||||
|
0 for hour, minutes and seconds) when there is at least one more global date
|
||||||
|
field that is set. Otherwise, they are set to the corresponding values of
|
||||||
|
"now". For example:
|
||||||
|
.RE
|
||||||
|
|
||||||
|
.RS
|
||||||
|
.RS
|
||||||
|
.br
|
||||||
|
8/1/2012 with m/d/Y implies August 1, 2012 at midnight (inferred)
|
||||||
|
.br
|
||||||
|
8/1 20:40 with m/d H:N implies August 1, 2012 (inferred) at 20:40
|
||||||
|
.RE
|
||||||
|
.RE
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B weekstart=Sunday
|
.B weekstart=Sunday
|
||||||
Determines the day a week starts. Valid values are Sunday or Monday only. The
|
Determines the day a week starts. Valid values are Sunday or Monday only. The
|
||||||
|
|||||||
@@ -697,8 +697,8 @@ bool Nibbler::getDateISO (time_t& t)
|
|||||||
// 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_mday = day;
|
|
||||||
tms.tm_mon = month - 1;
|
tms.tm_mon = month - 1;
|
||||||
|
tms.tm_mday = day;
|
||||||
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;
|
||||||
@@ -721,12 +721,12 @@ bool Nibbler::getDate (const std::string& format, time_t& t)
|
|||||||
{
|
{
|
||||||
std::string::size_type i = _cursor;
|
std::string::size_type i = _cursor;
|
||||||
|
|
||||||
int month = 0;
|
int month = -1; // So we can check later.
|
||||||
int day = 0;
|
int day = -1;
|
||||||
int year = -1; // So we can check later.
|
int year = -1;
|
||||||
int hour = 0;
|
int hour = -1;
|
||||||
int minute = 0;
|
int minute = -1;
|
||||||
int second = 0;
|
int second = -1;
|
||||||
|
|
||||||
for (unsigned int f = 0; f < format.length (); ++f)
|
for (unsigned int f = 0; f < format.length (); ++f)
|
||||||
{
|
{
|
||||||
@@ -983,14 +983,42 @@ bool Nibbler::getDate (const std::string& format, time_t& t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default the year to the current year, for formats that lack Y/y.
|
// By default, the most global date variables that are undefined are put to
|
||||||
|
// the current date (for instance, the year to the current year for formats
|
||||||
|
// that lack Y/y). If even 'second' is undefined, then the date is parsed as
|
||||||
|
// now.
|
||||||
if (year == -1)
|
if (year == -1)
|
||||||
{
|
{
|
||||||
time_t now = time (NULL);
|
Date now = Date ();
|
||||||
struct tm* default_year = localtime (&now);
|
year = now.year ();
|
||||||
year = default_year->tm_year + 1900;
|
if (month == -1)
|
||||||
|
{
|
||||||
|
month = now.month ();
|
||||||
|
if (day == -1)
|
||||||
|
{
|
||||||
|
day = now.day ();
|
||||||
|
if (hour == -1)
|
||||||
|
{
|
||||||
|
hour = now.hour ();
|
||||||
|
if (minute == -1)
|
||||||
|
{
|
||||||
|
minute = now.minute ();
|
||||||
|
if (second == -1)
|
||||||
|
second = now.second ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Put all remaining undefined date variables to their default values (0 or
|
||||||
|
// 1).
|
||||||
|
month = (month == -1) ? 1 : month;
|
||||||
|
day = (day == -1) ? 1 : day;
|
||||||
|
hour = (hour == -1) ? 0 : hour;
|
||||||
|
minute = (minute == -1) ? 0 : minute;
|
||||||
|
second = (second == -1) ? 0 : second;
|
||||||
|
|
||||||
// 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.
|
||||||
|
|||||||
@@ -39,15 +39,15 @@ int main (int argc, char** argv)
|
|||||||
{
|
{
|
||||||
#ifdef NIBBLER_FEATURE_DATE
|
#ifdef NIBBLER_FEATURE_DATE
|
||||||
#ifdef NIBBLER_FEATURE_REGEX
|
#ifdef NIBBLER_FEATURE_REGEX
|
||||||
UnitTest t (382);
|
UnitTest t (396);
|
||||||
#else
|
#else
|
||||||
UnitTest t (358);
|
UnitTest t (372);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#ifdef NIBBLER_FEATURE_REGEX
|
#ifdef NIBBLER_FEATURE_REGEX
|
||||||
UnitTest t (332);
|
UnitTest t (346);
|
||||||
#else
|
#else
|
||||||
UnitTest t (308);
|
UnitTest t (322);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -581,6 +581,27 @@ int main (int argc, char** argv)
|
|||||||
t.is (dt.hour (), 12, "ctor (std::string) -> h");
|
t.is (dt.hour (), 12, "ctor (std::string) -> h");
|
||||||
t.is (dt.minute (), 34, "ctor (std::string) -> N");
|
t.is (dt.minute (), 34, "ctor (std::string) -> N");
|
||||||
t.is (dt.second (), 56, "ctor (std::string) -> S");
|
t.is (dt.second (), 56, "ctor (std::string) -> S");
|
||||||
|
|
||||||
|
n = Nibbler ("2010");
|
||||||
|
t.ok (n.getDate ("Y", ti), "Y ok");
|
||||||
|
dt = Date (ti);
|
||||||
|
t.is (dt.month (), 1, "ctor (std::string) -> m");
|
||||||
|
t.is (dt.day (), 1, "ctor (std::string) -> d");
|
||||||
|
t.is (dt.year (), 2010, "ctor (std::string) -> Y");
|
||||||
|
t.is (dt.hour (), 0, "ctor (std::string) -> h");
|
||||||
|
t.is (dt.minute (), 0, "ctor (std::string) -> N");
|
||||||
|
t.is (dt.second (), 0, "ctor (std::string) -> S");
|
||||||
|
|
||||||
|
n = Nibbler ("17:18:19");
|
||||||
|
t.ok (n.getDate ("H:N:S", ti), "H:N:S ok");
|
||||||
|
dt = Date (ti);
|
||||||
|
Date now = Date ();
|
||||||
|
t.is (dt.month (), now.month(), "ctor (std::string) -> m");
|
||||||
|
t.is (dt.day (), now.day(), "ctor (std::string) -> d");
|
||||||
|
t.is (dt.year (), now.year(), "ctor (std::string) -> Y");
|
||||||
|
t.is (dt.hour (), 17, "ctor (std::string) -> h");
|
||||||
|
t.is (dt.minute (), 18, "ctor (std::string) -> N");
|
||||||
|
t.is (dt.second (), 19, "ctor (std::string) -> S");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// bool getOneOf (const std::vector <std::string>&, std::string&);
|
// bool getOneOf (const std::vector <std::string>&, std::string&);
|
||||||
|
|||||||
Reference in New Issue
Block a user