7 #include <grass/datetime.h>
9 static int _datetime_add_field(DateTime *, DateTime *,
int);
10 static int _datetime_subtract_field(DateTime *, DateTime *,
int);
14 static double _debug_decimal(DateTime * dt)
18 if (dt->mode == DATETIME_RELATIVE) {
20 dtdec = dt->year + dt->month / 12.;
23 dtdec = dt->day / 365.25 +
24 dt->hour / 8766. + dt->minute / 525960.
25 + dt->second / 31557600.;
79 if (src->mode == DATETIME_RELATIVE) {
97 if ((dt->positive && incr->positive) ||
98 (dt->mode == DATETIME_RELATIVE && !dt->positive && !incr->positive)) {
100 for (i = incr->to; i >= incr->from; i--) {
101 _datetime_add_field(dt, incr, i);
105 else if (!incr->positive || dt->mode == DATETIME_RELATIVE) {
107 for (i = incr->to; i >= incr->from; i--) {
108 _datetime_subtract_field(dt, incr, i);
114 else if (!incr->positive) {
116 for (i = incr->to; i > DATETIME_YEAR; i--) {
117 _datetime_subtract_field(dt, incr, i);
119 _datetime_add_field(dt, incr, DATETIME_YEAR);
123 for (i = incr->to; i > DATETIME_YEAR; i--) {
124 _datetime_add_field(dt, incr, i);
126 _datetime_subtract_field(dt, incr, DATETIME_YEAR);
131 if (src->mode == DATETIME_RELATIVE) {
153 static int _datetime_subtract_field(DateTime *src, DateTime *incr,
int field)
156 if (src->mode == DATETIME_RELATIVE) {
157 DateTime srcinc, tinc;
163 case DATETIME_SECOND:
166 if (src->second < incr->second) {
167 if ((
int)(incr->second - src->second) ==
168 (incr->second - src->second)) {
169 borrow = 1 + (incr->second - src->second - 1) / 60;
172 borrow = 1 + (incr->second - src->second) / 60;
173 src->second += borrow * 60;
175 src->second -= incr->second;
177 srcinc.minute = borrow;
178 _datetime_subtract_field(src, &srcinc, DATETIME_MINUTE);
182 case DATETIME_MINUTE:
183 if (src->minute < incr->minute) {
184 borrow = 1 + (incr->minute - src->minute - 1) / 60;
185 src->minute += borrow * 60;
187 src->minute -= incr->minute;
189 srcinc.hour = borrow;
190 _datetime_subtract_field(src, &srcinc, DATETIME_HOUR);
195 if (src->hour < incr->hour) {
196 borrow = 1 + (incr->hour - src->hour - 1) / 24;
197 src->hour += borrow * 24;
199 src->hour -= incr->hour;
202 _datetime_subtract_field(src, &srcinc, DATETIME_DAY);
207 if (src->day < incr->day) {
208 src->day = incr->day - src->day;
217 src->day -= incr->day;
221 if (src->month < incr->month) {
222 borrow = 1 + (incr->month - src->month - 1) / 12;
223 src->month += borrow * 12;
225 src->month -= incr->month;
227 srcinc.year = borrow;
228 _datetime_subtract_field(src, &srcinc, DATETIME_YEAR);
233 if (src->year < incr->year) {
234 src->year = incr->year - src->year;
241 src->year -= incr->year;
246 else if (src->mode == DATETIME_ABSOLUTE) {
247 DateTime srcinc, tinc, cpsrc;
248 int i, newdays, borrow = 0;
252 case DATETIME_SECOND:
253 if (src->second < incr->second) {
254 borrow = 1 + (incr->second - src->second - 1) / 60;
255 src->second += borrow * 60;
257 src->second -= incr->second;
259 srcinc.minute = borrow;
260 _datetime_subtract_field(src, &srcinc, DATETIME_MINUTE);
264 case DATETIME_MINUTE:
265 if (src->minute < incr->minute) {
266 borrow = 1 + (incr->minute - src->minute - 1) / 60;
267 src->minute += borrow * 60;
269 src->minute -= incr->minute;
271 srcinc.hour = borrow;
272 _datetime_subtract_field(src, &srcinc, DATETIME_HOUR);
277 if (src->hour < incr->hour) {
278 borrow = 1 + (incr->hour - src->hour - 1) / 24;
279 src->hour += borrow * 24;
281 src->hour -= incr->hour;
284 _datetime_subtract_field(src, &srcinc, DATETIME_DAY);
290 if (src->day <= incr->day) {
297 while (newdays <= incr->day) {
298 _datetime_subtract_field(&cpsrc, &tinc, DATETIME_MONTH);
305 src->day -= incr->day;
314 srcinc.month = borrow;
315 _datetime_subtract_field(src, &srcinc, DATETIME_MONTH);
320 if (src->month <= incr->month) {
321 borrow = 1 + (incr->month - src->month) / 12;
322 src->month += borrow * 12;
324 src->month -= incr->month;
326 srcinc.year = borrow;
327 _datetime_subtract_field(src, &srcinc, DATETIME_YEAR);
332 if (src->year <= incr->year) {
334 tinc.positive = src->positive;
336 tinc.month = src->month - 1;
337 src->year = incr->year - src->year + 1;
345 tinc.day = src->day - 1;
346 for (i = src->month - 1; i > 0; i--) {
350 tinc.hour = src->hour;
351 tinc.minute = src->minute;
352 tinc.second = src->second;
353 src->year = incr->year - src->year + 1;
358 src->hour = src->minute = 0;
364 src->year -= incr->year;
376 static int _datetime_carry(DateTime *dt,
int absolute)
381 for (i = dt->to; i > dt->from && i > DATETIME_DAY; i--) {
383 case DATETIME_SECOND:
384 if (dt->second >= 60.) {
385 carry = dt->second / 60.;
387 dt->second -= carry * 60;
390 case DATETIME_MINUTE:
391 if (dt->minute >= 60) {
392 carry = dt->minute / 60;
394 dt->minute -= carry * 60;
398 if (dt->hour >= 24) {
399 carry = dt->hour / 24;
401 dt->hour -= carry * 24;
408 if (!absolute && !dt->positive && dt->mode == DATETIME_ABSOLUTE) {
409 dt->year = -dt->year;
412 if (dt->from == DATETIME_YEAR && dt->to >= DATETIME_MONTH) {
415 if (dt->mode == DATETIME_ABSOLUTE) {
416 if (dt->month > 12) {
417 carry = (dt->month - 1) / 12;
421 dt->month -= carry * 12;
428 if (dt->month >= 12) {
429 carry = dt->month / 12;
431 dt->month -= carry * 12;
437 if (dt->mode == DATETIME_ABSOLUTE && dt->to > DATETIME_MONTH) {
443 if (dt->month == 12) {
456 if (!absolute && dt->mode == DATETIME_ABSOLUTE) {
458 dt->year = -dt->year;
468 static int _datetime_add_field(DateTime *src, DateTime *incr,
int field)
471 case DATETIME_SECOND:
472 src->second += incr->second;
474 case DATETIME_MINUTE:
475 src->minute += incr->minute;
478 src->hour += incr->hour;
481 src->day += incr->day;
484 src->month += incr->month;
487 src->year += incr->year;
490 if (src->mode == DATETIME_RELATIVE)
491 _datetime_carry(src, 1);
493 _datetime_carry(src, 0);
int datetime_change_from_to(DateTime *dt, int from, int to, int round)
Changes the from/to of the type for dt. The 'from/to' must be legal values for the mode of dt; (if th...
void datetime_copy(DateTime *dst, const DateTime *src)
Copies the DateTime [into/from ???] src.
int datetime_error_code(void)
returns an error code
int datetime_increment(DateTime *src, DateTime *incr)
This function changes the 'src' date/time data based on the 'incr' The type (mode/from/to) of the 'sr...
int datetime_is_valid_increment(const DateTime *src, const DateTime *incr)
Returns: datetime_check_increment(src, incr) == 0.
int datetime_set_increment_type(const DateTime *src, DateTime *incr)
src must be legal This is a convenience routine which is implemented as follows:
int datetime_days_in_month(int year, int month, int ad)
returns number of days in 'month' of a particular 'year'
void datetime_invert_sign(DateTime *dt)
int datetime_in_interval_day_second(int x)
int datetime_in_interval_year_month(int x)