/* 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;
}
Exemple #2
0
	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");
	}
Exemple #3
0
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);
}
Exemple #4
0
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);
}
Exemple #5
0
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;
}
Exemple #7
0
Fichier : Tinfo.c Projet : AZed/cdo
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;
}