@@ -66,9 +66,15 @@ bool Datetime::isoEnabled = true;
6666bool Datetime::standaloneDateEnabled = true ;
6767bool Datetime::standaloneTimeEnabled = true ;
6868
69- // When true, HH:MM:SS is assumed to be today if the time > now, otherwise it is
70- // asumed to be tomorrow. When false, it is always today.
71- bool Datetime::timeRelative = true ;
69+ // When true,
70+ // - HH:MM:SS is assumed to be today if the time > now, otherwise it is assumed to be tomorrow.
71+ // - day name is converted to date relative to now
72+ // - 1st, 2nd, 3rd, ... is converted to date relative to now
73+ // When false,
74+ // - HH:MM:SS is always today.
75+ // - day name is always converted to date before now
76+ // - 1st, 2nd, 3rd, ... is always converted to date before now
77+ bool Datetime::timeRelative = true ;
7278
7379// //////////////////////////////////////////////////////////////////////////////
7480Datetime::Datetime ()
@@ -1456,16 +1462,15 @@ bool Datetime::initializeOrdinal (Pig& pig)
14561462 int d = t->tm_mday ;
14571463
14581464 // If it is this month.
1459- if (d < number &&
1460- number <= daysInMonth (y, m))
1465+ if (timeRelative && (d < number && number <= daysInMonth (y, m)))
14611466 {
14621467 t->tm_hour = t->tm_min = t->tm_sec = 0 ;
14631468 t->tm_mon = m - 1 ;
14641469 t->tm_mday = number;
14651470 t->tm_year = y - 1900 ;
14661471 t->tm_isdst = -1 ;
14671472 }
1468- else
1473+ else if (timeRelative && ( 1 <= number && number <= d))
14691474 {
14701475 if (++m > 12 )
14711476 {
@@ -1479,6 +1484,28 @@ bool Datetime::initializeOrdinal (Pig& pig)
14791484 t->tm_year = y - 1900 ;
14801485 t->tm_isdst = -1 ;
14811486 }
1487+ else if (!timeRelative && (d < number && number <= daysInMonth (y, m)))
1488+ {
1489+ if (--m < 1 )
1490+ {
1491+ m = 12 ;
1492+ y--;
1493+ }
1494+
1495+ t->tm_hour = t->tm_min = t->tm_sec = 0 ;
1496+ t->tm_mon = m - 1 ;
1497+ t->tm_mday = number;
1498+ t->tm_year = y - 1900 ;
1499+ t->tm_isdst = -1 ;
1500+ }
1501+ else if (!timeRelative && (1 <= number && number <= d))
1502+ {
1503+ t->tm_hour = t->tm_min = t->tm_sec = 0 ;
1504+ t->tm_mon = m - 1 ;
1505+ t->tm_mday = number;
1506+ t->tm_year = y - 1900 ;
1507+ t->tm_isdst = -1 ;
1508+ }
14821509
14831510 _date = mktime (t);
14841511
0 commit comments