8 #include <grass/datetime.h>
43 static int _datetime_ymd_to_ddays(
const DateTime *,
double *);
44 static int _datetime_compare(
const DateTime *,
const DateTime *);
83 DateTime tb, ta, *early, *late;
101 "only one opperand contains valid timezone");
106 ta.to < DATETIME_DAY ? DATETIME_YEAR : DATETIME_DAY,
108 compare = _datetime_compare(&ta, &tb);
112 result->positive = 1;
114 else if (compare < 0) {
117 result->positive = 0;
127 if (ta.positive == tb.positive) {
129 result->year = abs(late->year - early->year);
132 result->year = late->year + early->year - 2;
134 dm = late->month - early->month;
139 result->month = dm + 12;
144 double latedays, earlydays;
147 _datetime_ymd_to_ddays(early, &earlydays);
149 erel.day = earlydays;
150 erel.hour = early->hour;
151 erel.minute = early->minute;
152 erel.second = early->second;
155 _datetime_ymd_to_ddays(late, &latedays);
158 lrel.hour = late->hour;
159 lrel.minute = late->minute;
160 lrel.second = late->second;
166 result->day = erel.day;
167 result->hour = erel.hour;
168 result->minute = erel.minute;
169 result->second = erel.second;
184 static int _datetime_compare(
const DateTime * a,
const DateTime *
b)
188 if (a->positive && !
b->positive)
190 else if (
b->positive && !a->positive)
194 for (i = a->from; i <= a->to; i++) {
197 case DATETIME_SECOND:
198 if (a->second >
b->second)
200 else if (a->second <
b->second)
204 case DATETIME_MINUTE:
205 if (a->minute >
b->minute)
207 else if (a->minute <
b->minute)
212 if (a->hour >
b->hour)
214 else if (a->hour <
b->hour)
221 else if (a->day <
b->day)
226 if (a->month >
b->month)
228 else if (a->month <
b->month)
234 if (a->year >
b->year)
236 else if (a->year <
b->year)
240 if (a->year <
b->year)
242 else if (a->year >
b->year)
255 static int _datetime_ymd_to_ddays(
const DateTime * dtymd,
double *days)
262 if (dtymd->positive) {
263 *days = dtymd->day - 1;
264 for (mo = dtymd->month - 1; mo > 0; mo--) {
267 for (yr = dtymd->year - 1; yr > 0; yr--) {
272 for (yr = dtymd->year - 1; yr > 0; yr--) {
275 for (mo = 12; mo >= dtymd->month; mo--) {