7#include <grass/datetime.h>
9static int _datetime_add_field(DateTime *, DateTime *,
int);
10static int _datetime_subtract_field(DateTime *, DateTime *,
int);
14static 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.;
80 if (src->mode == DATETIME_RELATIVE) {
98 if ((dt->positive && incr->positive) ||
99 (dt->mode == DATETIME_RELATIVE && !dt->positive && !incr->positive)) {
101 for (i = incr->to; i >= incr->from; i--) {
102 _datetime_add_field(dt, incr, i);
106 else if (!incr->positive || dt->mode == DATETIME_RELATIVE) {
108 for (i = incr->to; i >= incr->from; i--) {
109 _datetime_subtract_field(dt, incr, i);
115 else if (!incr->positive) {
117 for (i = incr->to; i > DATETIME_YEAR; i--) {
118 _datetime_subtract_field(dt, incr, i);
120 _datetime_add_field(dt, incr, DATETIME_YEAR);
124 for (i = incr->to; i > DATETIME_YEAR; i--) {
125 _datetime_add_field(dt, incr, i);
127 _datetime_subtract_field(dt, incr, DATETIME_YEAR);
132 if (src->mode == DATETIME_RELATIVE) {
155static int _datetime_subtract_field(DateTime *src, DateTime *incr,
int field)
158 if (src->mode == DATETIME_RELATIVE) {
159 DateTime srcinc, tinc;
165 case DATETIME_SECOND:
168 if (src->second < incr->second) {
169 if ((
int)(incr->second - src->second) ==
170 (incr->second - src->second)) {
171 borrow = 1 + (incr->second - src->second - 1) / 60;
174 borrow = 1 + (incr->second - src->second) / 60;
175 src->second += borrow * 60;
177 src->second -= incr->second;
179 srcinc.minute = borrow;
180 _datetime_subtract_field(src, &srcinc, DATETIME_MINUTE);
184 case DATETIME_MINUTE:
185 if (src->minute < incr->minute) {
186 borrow = 1 + (incr->minute - src->minute - 1) / 60;
187 src->minute += borrow * 60;
189 src->minute -= incr->minute;
191 srcinc.hour = borrow;
192 _datetime_subtract_field(src, &srcinc, DATETIME_HOUR);
197 if (src->hour < incr->hour) {
198 borrow = 1 + (incr->hour - src->hour - 1) / 24;
199 src->hour += borrow * 24;
201 src->hour -= incr->hour;
204 _datetime_subtract_field(src, &srcinc, DATETIME_DAY);
209 if (src->day < incr->day) {
210 src->day = incr->day - src->day;
219 src->day -= incr->day;
223 if (src->month < incr->month) {
224 borrow = 1 + (incr->month - src->month - 1) / 12;
225 src->month += borrow * 12;
227 src->month -= incr->month;
229 srcinc.year = borrow;
230 _datetime_subtract_field(src, &srcinc, DATETIME_YEAR);
235 if (src->year < incr->year) {
236 src->year = incr->year - src->year;
243 src->year -= incr->year;
248 else if (src->mode == DATETIME_ABSOLUTE) {
249 DateTime srcinc, tinc, cpsrc;
250 int i, newdays, borrow = 0;
254 case DATETIME_SECOND:
255 if (src->second < incr->second) {
256 borrow = 1 + (incr->second - src->second - 1) / 60;
257 src->second += borrow * 60;
259 src->second -= incr->second;
261 srcinc.minute = borrow;
262 _datetime_subtract_field(src, &srcinc, DATETIME_MINUTE);
266 case DATETIME_MINUTE:
267 if (src->minute < incr->minute) {
268 borrow = 1 + (incr->minute - src->minute - 1) / 60;
269 src->minute += borrow * 60;
271 src->minute -= incr->minute;
273 srcinc.hour = borrow;
274 _datetime_subtract_field(src, &srcinc, DATETIME_HOUR);
279 if (src->hour < incr->hour) {
280 borrow = 1 + (incr->hour - src->hour - 1) / 24;
281 src->hour += borrow * 24;
283 src->hour -= incr->hour;
286 _datetime_subtract_field(src, &srcinc, DATETIME_DAY);
292 if (src->day <= incr->day) {
299 while (newdays <= incr->day) {
300 _datetime_subtract_field(&cpsrc, &tinc, DATETIME_MONTH);
307 src->day -= incr->day;
316 srcinc.month = borrow;
317 _datetime_subtract_field(src, &srcinc, DATETIME_MONTH);
322 if (src->month <= incr->month) {
323 borrow = 1 + (incr->month - src->month) / 12;
324 src->month += borrow * 12;
326 src->month -= incr->month;
328 srcinc.year = borrow;
329 _datetime_subtract_field(src, &srcinc, DATETIME_YEAR);
334 if (src->year <= incr->year) {
336 tinc.positive = src->positive;
338 tinc.month = src->month - 1;
339 src->year = incr->year - src->year + 1;
347 tinc.day = src->day - 1;
348 for (i = src->month - 1; i > 0; i--) {
352 tinc.hour = src->hour;
353 tinc.minute = src->minute;
354 tinc.second = src->second;
355 src->year = incr->year - src->year + 1;
360 src->hour = src->minute = 0;
366 src->year -= incr->year;
378static int _datetime_carry(DateTime *dt,
int absolute)
383 for (i = dt->to; i > dt->from && i > DATETIME_DAY; i--) {
385 case DATETIME_SECOND:
386 if (dt->second >= 60.) {
387 carry = dt->second / 60.;
389 dt->second -= carry * 60;
392 case DATETIME_MINUTE:
393 if (dt->minute >= 60) {
394 carry = dt->minute / 60;
396 dt->minute -= carry * 60;
400 if (dt->hour >= 24) {
401 carry = dt->hour / 24;
403 dt->hour -= carry * 24;
410 if (!absolute && !dt->positive && dt->mode == DATETIME_ABSOLUTE) {
411 dt->year = -dt->year;
414 if (dt->from == DATETIME_YEAR && dt->to >= DATETIME_MONTH) {
417 if (dt->mode == DATETIME_ABSOLUTE) {
418 if (dt->month > 12) {
419 carry = (dt->month - 1) / 12;
423 dt->month -= carry * 12;
430 if (dt->month >= 12) {
431 carry = dt->month / 12;
433 dt->month -= carry * 12;
439 if (dt->mode == DATETIME_ABSOLUTE && dt->to > DATETIME_MONTH) {
445 if (dt->month == 12) {
458 if (!absolute && dt->mode == DATETIME_ABSOLUTE) {
460 dt->year = -dt->year;
470static int _datetime_add_field(DateTime *src, DateTime *incr,
int field)
473 case DATETIME_SECOND:
474 src->second += incr->second;
476 case DATETIME_MINUTE:
477 src->minute += incr->minute;
480 src->hour += incr->hour;
483 src->day += incr->day;
486 src->month += incr->month;
489 src->year += incr->year;
492 if (src->mode == DATETIME_RELATIVE)
493 _datetime_carry(src, 1);
495 _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)