/* Convert a Julian date back to YEAR, MONTH and DAY. Return day of the year or 0 on error. This function uses some more or less arbitrary limits, most important is that days before 1582-10-15 are not supported. */ static int jd2date (unsigned long jd, int *year, int *month, int *day) { int y, m, d; long delta; if (!jd) return 0 ; if (jd < 1721425 || jd > 2843085) return 0; y = (jd - JD_DIFF) / 366; d = m = 1; while ((delta = jd - date2jd (y, m, d)) > days_per_year (y)) y++; m = (delta / 31) + 1; while( (delta = jd - date2jd (y, m, d)) > days_per_month (y,m)) if (++m > 12) { m = 1; y++; } d = delta + 1 ; if (d > days_per_month (y, m)) { d = 1; m++; } if (m > 12) { m = 1; y++; } if (year) *year = y; if (month) *month = m; if (day) *day = d ; return (jd - date2jd (y, 1, 1)) + 1; }
Julian::Julian(int year, int month, int day) : GreLian(year, month, day) { if (month < 1 || month > months_per_year()) throw std::out_of_range("Month is invalid!\n"); if (year < 1858 || year > 2558) throw std::out_of_range("Year is invalid!\n"); if (day < 1 || day > days_per_month(month)) throw std::out_of_range("Day is invalid!\n"); }
void add_days(ha_time_t * a_time, int extra) { if (a_time->has->days == FALSE) { crm_trace("has->days == FALSE"); return; } if (extra < 0) { sub_days(a_time, -extra); } else { do_add_field(a_time, days, extra, days_per_month(a_time->months, a_time->years), add_months); } convert_from_gregorian(a_time); }
void sub_days(ha_time_t * a_time, int extra) { if (a_time->has->days == FALSE) { crm_trace("has->days == FALSE"); return; } crm_trace("Subtracting %d days from %.4d-%.2d-%.2d", extra, a_time->years, a_time->months, a_time->days); if (extra < 0) { add_days(a_time, -extra); } else { do_sub_field(a_time, days, extra, days_per_month(a_time->months, a_time->years), sub_months); } convert_from_gregorian(a_time); }
void add_months(ha_time_t * a_time, int extra) { int max = 0; if (a_time->has->months == FALSE) { crm_trace("has->months == FALSE"); return; } if (extra < 0) { sub_months(a_time, -extra); } else { do_add_field(a_time, months, extra, 12, add_years); } max = days_per_month(a_time->months, a_time->years); if (a_time->days > max) { a_time->days = max; } convert_from_gregorian(a_time); }
double join_time(int yyyy, int mm, int dd, int hh, int mi, int ss, int msec) { int year,month; double day,time; /* Switch debug messages from main on/off (1/0). */ int diagnostic = 0; if (yyyy == NULLVAL) return NULLVAL; if (diagnostic){ fprintf(logfp,"join_time: %d %d %d ",yyyy,mm,dd); fprintf(logfp,"%d %d %d %d\n",hh,mi,ss,msec); } day = 0; if (yyyy > EPOCH_YEAR) for (year=EPOCH_YEAR; year<yyyy; year++) day += days_per_year(year); else for (year=yyyy; year<EPOCH_YEAR; year++) day -= days_per_year(year); for (month=1; month<mm; month++) day += days_per_month(month,yyyy); day += dd-1; time = day*86400; time += hh*3600; time += mi*60; time += ss; if (msec != NULLVAL) time += msec*0.001; if (diagnostic) fprintf(logfp,"join_time: %f\n",time); return time; }
static int fill_gap(int ngaps, int ntsm[MAX_NTSM], int rangetsm[MAX_GAPS][2], int vdatem[MAX_GAPS][MAX_NTSM], int vtimem[MAX_GAPS][MAX_NTSM], int tsID, int incperiod0, int incunit0, int vdate, int vdate0, int vtime0, int calendar, int day0, juldate_t juldate, juldate_t juldate0) { int its = 0; int year, month, day; int ndate, ntime; int ijulinc = incperiod0 * iunits[incunit0]; if ( ijulinc > 0 && ngaps < MAX_GAPS ) { rangetsm[ngaps][0] = tsID; rangetsm[ngaps][1] = tsID+1; if ( incunit0 == TU_MONTHS || incunit0 == TU_YEARS ) { its = 0; ndate = vdate0; //printf("fill_gap %d\n", ndate); while ( TRUE ) { cdiDecodeDate(ndate, &year, &month, &day); month += ijulinc; while ( month > 12 ) { month -= 12; year++; } while ( month < 1 ) { month += 12; year--; } if ( day0 == 31 ) day = days_per_month(calendar, year, month); ndate = cdiEncodeDate(year, month, day); ntime = vtime0; if ( ndate >= vdate ) break; /* printf("\n1 %d %d\n", ndate, ntime); */ if ( its < MAX_NTSM ) { vdatem[ngaps][its] = ndate; vtimem[ngaps][its] = ntime; } else if ( its >= LIM_NTSM ) break; its++; } } else { its = 0; juldate0 = juldate_add_seconds(ijulinc, juldate0); while ( juldate_to_seconds(juldate0) < juldate_to_seconds(juldate) ) { juldate_decode(calendar, juldate0, &ndate, &ntime); juldate0 = juldate_add_seconds(ijulinc, juldate0); if ( its < MAX_NTSM ) { vdatem[ngaps][its] = ndate; vtimem[ngaps][its] = ntime; } else if ( its >= LIM_NTSM ) break; its++; } } ntsm[ngaps] = its; } return (its); }
int split_time(double time, int *yyyy, int *mm, int *dd,int *hh, int *mi, int *ss, int *msec) { int year,month,hour,min; double day,sec; /* Switch debug messages from main on/off (1/0). */ int diagnostic = 0; if (time == NULLVAL) return 1; if (diagnostic) fprintf(logfp,"split_time: time=%f ",time); /* Split into days before/after epoch and seconds since start of day. */ /* Get date from day. */ day = (int)(time/86400); year= EPOCH_YEAR; if (day >= 0){ sec = time - day*86400; day++; while (day > days_per_year(year)){ day -= days_per_year(year); year++; } } else{ sec = time - day*86400; if (sec != 0){ day--; sec+=86400; } while (day < 0 ){ day += days_per_year(year); year--; } } for (month=1; month<13; month++){ if (day <= days_per_month(month,year)){ break; } day -= days_per_month(month,year); } if (diagnostic) fprintf(logfp,"split_time: year=%d month=%d day=%f ",year,month,day); /* Get time from sec */ min = sec/60; sec -= min*60; hour = min/60; min -= hour*60; if (diagnostic) fprintf(logfp,"split_time: hour=%d min=%d sec=%f\n",hour,min,sec); *yyyy = year; *mm = month; *dd = day; *hh = hour; *mi = min; *ss = (int)sec; *msec = (sec-*ss)*1000; *msec = (int)(*msec+0.5); return 0; }