示例#1
0
/* compute date from the number of days since Jan 1 */
int date_from_ydays(int dayyear, struct tm *thetime)
{
	int i, j;
	int month = 0;
	int day = 0;

	j = (leapyear(0,thetime->tm_year+1900)) ? 0 : 1;
	for (i=0; i <= dayyear+j; ++i)
		switch (i) {
			case 31: ++month; day = i; break;
			case 60: ++month; day = i; break;
			case 91: ++month;	day = i; break;
			case 121: ++month; day = i; break;
			case 152: ++month; day = i; break;
			case 182: ++month; day = i; break;
			case 213: ++month; day = i; break;
			case 244: ++month; day = i; break;
			case 274: ++month; day = i; break;
			case 305: ++month; day = i; break;
			case 335: ++month; day = i; break;
		}
	thetime->tm_mon = month;
	if (leapyear(0,thetime->tm_year+1900))
		day = dayyear - day + 0;
	else
		day = dayyear - day + 2;
	thetime->tm_mday = day;
	return 0;
}
示例#2
0
/* parses string for weekdays and related modifiers; if
 * weekday on its own, assume "this coming"; if "last", then
 * the week prior */
int parse_for_weekday(char *s, struct tm *thetime)
{
	int tmp, tmp2, i;
	int dayyear, maxdays;
	char *daypoint = NULL; /* point at weekday in s */
	char *lastpoint; /* if "last" or "next" is in string */

	tmp = thetime->tm_wday;	 /* tmp:  current weekday num */
	for (i=0; i <= 6; ++i) {
		if ((daypoint = strstr(s,weekdays[i].longname)) || 
		(daypoint = strstr(s,weekdays[i].shortname))) {
			tmp2 = weekdays[i].num;  /* tmp2:  new weekday num */
			break;
		}
	}
	if (daypoint == NULL)
		return -1;
	thetime->tm_wday = tmp2; /* new weekday into struct */
	if ((lastpoint = strstr(s,"last")) && (lastpoint <
	daypoint) && (lastpoint != NULL)) {
		if (tmp2 < tmp)
			dayyear = tmp2 - tmp;
		else
			dayyear = (7 - (abs(tmp - tmp2))) * -1;
		if (dayyear < 0) {
			thetime->tm_year -= 1;
			dayyear += (leapyear(0,thetime->tm_year+1900)) ? 366	: 367;
			thetime->tm_mon = 0;
		}
	} else {
		tmp2 = (tmp2 == 0) ? 7 : tmp2;
		if (tmp2 > tmp)
			dayyear = abs(tmp - tmp2);
		else
			dayyear = (7 - (abs(tmp - tmp2)));
		if ((lastpoint = strstr(s,"next")) && (lastpoint <
		daypoint) && (lastpoint != NULL))
			dayyear += 7;
	}
	maxdays = (leapyear(0,thetime->tm_year+1900)) ? 365 : 364;
	if (leapyear(0,thetime->tm_year+1900) && (dayyear >= 58))
		dayyear += 1;
	dayyear += thetime->tm_yday;
/*	printf("MAXDAYS:  %d; DAYYEAR:  %d\n",maxdays,dayyear);*/
	if ((dayyear > (maxdays+1))) {
		dayyear -= maxdays;
		dayyear -= 3;
		thetime->tm_year += 1;
	}
	thetime->tm_yday = dayyear; /* put yday into struct */
	date_from_ydays(dayyear,thetime);
	return 0;
}
示例#3
0
/* calculate ydays from the date; return ydays; redundant,
 * but harmless, the relative date options were used */
int ydays_from_date(struct tm *thetime)
{
	int ydays = 0;

	switch (thetime->tm_mon) {
	case 0:  ydays += 0; break;
	case 1:  ydays += 31; break;
	case 2:  ydays += 59; break;
	case 3:  ydays += 90; break;
	case 4:  ydays += 120; break;
	case 5:  ydays += 151; break;
	case 6:  ydays += 181; break;
	case 7:  ydays += 212; break;
	case 8:  ydays += 243; break;
	case 9:  ydays += 273; break;
	case 10:  ydays += 304; break;
	case 11:  ydays += 334; break;
	default:
		fprintf(stderr, "dozdate:  error:  %d is an invalid "
		"month\n",thetime->tm_mon-1);
		exit(BAD_MONTH);
		break;
	}
	if ((leapyear(0,thetime->tm_year+1900)) && (thetime->tm_mon > 1))
		++ydays;
	return ydays + thetime->tm_mday - 1;
}
示例#4
0
文件: rtc.c 项目: jameshilliard/prism
void to_tm(int tim, MV_RTC_TIME *tm)
{
        register int i;
        register long hms, day, gday;
 
        gday = day = tim / SECDAY;
        hms = tim % SECDAY;
        /* Hours, minutes, seconds are easy */
        tm->hours = hms / 3600;
        tm->minutes = (hms % 3600) / 60;
        tm->seconds = (hms % 3600) % 60;
 
        /* Number of years in days */
        for (i = STARTOFTIME; day >= days_in_year(i); i++)
                day -= days_in_year(i);
        tm->year = i;
 
        /* Number of months in days left */
        if (leapyear(tm->year))
                days_in_month(FEBRUARY) = 29;
        for (i = 1; day >= days_in_month(i); i++)
                day -= days_in_month(i);
        days_in_month(FEBRUARY) = 28;
        tm->month = i;
 
        /* Days are what is left over (+1) from all that. */
        tm->date = day + 1;
 
        /*
         * Determine the day of week. Jan. 1, 1970 was a Thursday.
         */
        tm->day = (gday + 4) % 7;
}
示例#5
0
u16 year_to_day(u16 year)
{
    if (leapyear(year))
        return 366;
    else
        return 365;
}
示例#6
0
文件: coptic.c 项目: tsupo/tamo
int
copDaysOfYear( int cY )
{
    int     y = cY - 1995 + 2003 + 1;   /* 最後の + 1 は 閏年を when.exe に
                                           合わせるための補正               */
    return ( leapyear(y) ? 366 : 365 );
}
示例#7
0
u16 month_to_day(u16 year,u8 month)
{
    if (leapyear(year))
        return smonth_tab2[month];
    else
        return smonth_tab1[month];
}
示例#8
0
time_t
clock_ymdhms_to_secs(struct clock_ymdhms *dt)
{
	time_t secs;
	int i, year, days;

	year = dt->dt_year;

	/*
	 * Compute days since start of time.
	 * First from years, then from months.
	 */
	days = 0;
	for (i = POSIX_BASE_YEAR; i < year; i++)
		days += days_in_year(i);
	if (leapyear(year) && dt->dt_mon > FEBRUARY)
		days++;

	/* Months */
	for (i = 1; i < dt->dt_mon; i++)
	  	days += days_in_month(i);
	days += (dt->dt_day - 1);

	/* Add hours, minutes, seconds. */
	secs = (time_t)((days
	    * 24 + dt->dt_hour)
	    * 60 + dt->dt_min)
	    * 60 + dt->dt_sec;

	return (secs);
}
示例#9
0
 // number of day in year
 int day_in_year(const Date& d)
 {
     int diy = nmonth(d.month());                        // days in months before d
     diy += d.day();                                     // days in month of d
     if (leapyear(d.year()) && d.month()>Date::feb) ++diy; // add day if leap year and later than February
     return diy;
 }
示例#10
0
void to_tm(unsigned long tim, struct rtc_time * tm)
{
	long hms, day, gday;
	int i;

	gday = day = tim / SECDAY;
	hms = tim % SECDAY;

	/* Hours, minutes, seconds are easy */
	tm->tm_hour = hms / 3600;
	tm->tm_min = (hms % 3600) / 60;
	tm->tm_sec = (hms % 3600) % 60;

	/* Number of years in days */
	for (i = STARTOFTIME; day >= days_in_year(i); i++)
	day -= days_in_year(i);
	tm->tm_year = i;

	/* Number of months in days left */
	if (leapyear(tm->tm_year))
	days_in_month(FEBRUARY) = 29;
	for (i = 1; day >= days_in_month(i); i++)
	day -= days_in_month(i);
	days_in_month(FEBRUARY) = 28;
	tm->tm_mon = i-1;	/* tm_mon starts from 0 to 11 */

	/* Days are what is left over (+1) from all that. */
	tm->tm_mday = day + 1;

	/*
	 * Determine the day of week
	 */
	tm->tm_wday = (gday + 4) % 7; /* 1970/1/1 was Thursday */
}
示例#11
0
u8 nowmonth(u8 nmonth,u16 nyear)
{
    if (leapyear(nyear))
        return month_tab2[nmonth-1];
    else
        return month_tab1[nmonth-1];

}
示例#12
0
int main()
{
    freopen("output.txt","w",stdout);
    int i=0;
    for(i=1900;i<2100;i++)
        leapyear(i);
    return 0;
}
示例#13
0
/*
 *  add @n year to date
 */
Date& Date::add_year(int n)
{
    if (n) {
	int  yy;
	yy = y + n;
	
	if (d == month_days(m, y))
	    if ( (!leapyear(y) && leapyear(yy)) ||
		 (leapyear(y) && !leapyear(yy)) )
		d = month_days(m, yy);
	y = yy;

	cache->valid = false;
    }
    
    return *this;
}
示例#14
0
int monthdays(int year, int month)
{
	int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	
	if (month==1) // February
		return (leapyear(year) ? 29 : 28);
	return days[month];
}
示例#15
0
void Date::add_year(int n)
{
    if (m==feb && d==29 && !leapyear(y+n)) { // beware of leap years!
        m = mar;        // use March 1 instead of February 29
        d = 1;
    }
    y+=n;
}
示例#16
0
文件: ex22.c 项目: 0uverture/BPRD
void main(int n) {
  int y;
  y = 1889;
  while (y < n) {
    y = y + 1;
    if (leapyear(y))
      print y;
  }
}
示例#17
0
int validday(int yy, int mon, int dd)
{
    int daysinmonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (mon == 2) {
        daysinmonth[2] += leapyear(yy);
    }
    if (dd <= daysinmonth[mon]) return 1;
    return 0;
} // validday()
示例#18
0
 // number of leap years between 1970 and Jan 1, year y
 int n_leapyears(int y)
 {
     // go through every year since 1970, check if it is a leap year
     int nl = 0;
     for (int i = 1970; i<y; ++i) {
         if (leapyear(i)) ++nl;
     }
     return nl;
 }
示例#19
0
Date& Date::add_year(int n) {
   if (d==29 && m==2 && !leapyear(y+n)) {
      // beware of February 29
      d=1;
      m=3;
   }
   y += n;
   return *this;
};
示例#20
0
 void Date::add_year(int n) // If you add a year to the last day of Feb, you will get a last day of Feb (depending on the leap year it will be 28 or 29)
 {
   //if (m==Month::feb && d==29 && !leapyear(y+n)) { // beware of leap years!
   //  m = Month::mar;
   //}

   // I think it would make more sense that if we are at the last day of February and we add a year, we are still at the last day of Februay
   if (m==Month::feb){
     if ( (leapyear(y) && d==29) || (!leapyear(y) && d==28) )  // if the last day of February
     {
       if (leapyear(y+n))
         d = 29;
       else
         d = 28;
     }
   }
   y+=n;
 }
示例#21
0
void Date::add_year(int n)
{
    if (m==feb && d==29 && !leapyear(y+n)) { // beware of leap years!
			// makes sense for both positive and negative n (n==0 should be impossible here)
			m = mar;        // use March 1 instead of February 29
			d = 1;
    }
    y+=n;
}
示例#22
0
int main()
try
{
	vector<int> year;	// for a bit of automatic testing
	year.push_back(0);
	year.push_back(2000);
	year.push_back(1900);
	year.push_back(2009);
	year.push_back(2400);
	year.push_back(1968);
	year.push_back(1950);
	year.push_back(2010);
	year.push_back(2012);
	year.push_back(2020);
	year.push_back(1968);

	for (int i = 0; i<year.size(); ++i) {
		cout << year[i] << " is ";
		if (leapyear(year[i])==false) cout << "not ";
		cout << "a leapyear\n";
	}
	
	// now let the user try:
	cout<< "please enter a year: ";

	int n;
	while (cin>>n) {	// read a year
		cout << n << " is ";
		if (leapyear(n)==false) cout << "not ";
		cout << "a leapyear\n";
		cout << "Try again: ";
	}
	keep_window_open("~");	// For some Windows(tm) setups
}
catch (runtime_error e) {	// this code is to produce error messages; it will be described in Chapter 5
	cout << e.what() << '\n';
	keep_window_open("~");	// For some Windows(tm) setups
}
catch (...) {	// this code is to produce error messages; it will be described in Chapter 5
	cout << "exiting\n";
	keep_window_open("~");	// For some Windows(tm) setups
}
示例#23
0
int days_in_month(int y, Date::Month m)
{
    switch (m) {
	case Date::feb:                        // the length of February varies
		return (leapyear(y))?29:28;
	case Date::apr: case Date::jun: case Date::sep: case Date::nov:
		return 30;
	default:
		return 31;
    }
}
示例#24
0
文件: time.c 项目: Bibamaru/showtime
int
mktime_utc(time_t *tp, unsigned int year, unsigned int month, unsigned int day,
           unsigned int hour, unsigned int min, unsigned int sec)
{
  int i;

  if(year < 1970 || year > 2038 || month >= 12)
    return -1;

  i = 1970;
  if(year >= 2011) {
    sec += 1293840000;
    i = 2011;
  }

  for(; i < year; i++)
    sec += 86400 * (365 + leapyear(i));

  sec += mdays[leapyear(year)][month] * 86400;
  sec += 86400 * (day - 1) + hour * 3600 + min * 60;
  *tp = sec;
  return 0;
}
示例#25
0
 int Date:: days_in_month(const Month& mth, int year ) // returns the number of days in a given month. We only use year for Month::feb to determine a leap year
 {
   int days_in_month = 31;  // most months have 31 days

   switch (mth) {
   case Month::feb:   // the length of February varies
     days_in_month = (leapyear(year))?29:28;
     break;
   case Month::apr: case Month::jun: case Month::sep: case Month::nov:
     days_in_month = 30;  // the rest have 30 days
     break;
   }
   return days_in_month;
 }
示例#26
0
/*----------------------------------------------------------------------------*/
u16 ymd_to_day(RTC_TIME *time)
{
    u16 _xdata tmp_year;
    u16 _xdata tmp_day = 0;

    for (tmp_year=YEAR;tmp_year<time->year;tmp_year++)			//年->日,当年不算在内,所以是<
    {
        tmp_day += year_to_day(tmp_year);
    }

    if (leapyear(time->year))						//月->日
        tmp_day += smonth_tab2[time->month-1];
    else
        tmp_day += smonth_tab1[time->month-1];

    tmp_day += (time->day-1);						//日->日,当日不算在内,所以日应该减1
    return tmp_day;
}
示例#27
0
int
bbc_to_gmt(u_long *timbuf)
{
	int i;
	u_long tmp;
	int year, month, day, hour, min, sec;

	read_bbc();

	sec = bbc_to_decimal(1, 0);
	min = bbc_to_decimal(3, 2);

	/*
	 * Hours are different for some reason. Makes no sense really.
	 */
	hour  = ((bbc_registers[5] & 0x03) * 10) + bbc_registers[4];
	day   = bbc_to_decimal(8, 7);
	month = bbc_to_decimal(10, 9);
	year  = bbc_to_decimal(12, 11) + 1900;

	range_test(hour, 0, 23);
	range_test(day, 1, 31);
	range_test(month, 1, 12);
	range_test(year, STARTOFTIME, 2038);	/* 2038 is the end of time. */

	tmp = 0;

	for (i = STARTOFTIME; i < year; i++)
		tmp += days_in_year(i);
	if (leapyear(year) && month > FEBRUARY)
		tmp++;

	for (i = 1; i < month; i++)
	  	tmp += days_in_month(i);

	tmp += (day - 1);
	tmp = ((tmp * 24 + hour) * 60 + min) * 60 + sec;

	*timbuf = tmp;
	return(1);
}
示例#28
0
int rtc_to_tm(int tim, struct rtc_time *tm)
{
	register int    i;
	register long   hms, day;

	day = tim / SECDAY;
	hms = tim % SECDAY;

	/* Hours, minutes, seconds are easy */
	tm->tm_hour = hms / 3600;
	tm->tm_min = (hms % 3600) / 60;
	tm->tm_sec = (hms % 3600) % 60;

	/* Number of years in days */
	for (i = STARTOFTIME; day >= days_in_year(i); i++) {
		day -= days_in_year(i);
	}
	tm->tm_year = i;

	/* Number of months in days left */
	if (leapyear(tm->tm_year)) {
		days_in_month(FEBRUARY) = 29;
	}
	for (i = 1; day >= days_in_month(i); i++) {
		day -= days_in_month(i);
	}
	days_in_month(FEBRUARY) = 28;
	tm->tm_mon = i;

	/* Days are what is left over (+1) from all that. */
	tm->tm_mday = day + 1;

	/* Zero unused fields */
	tm->tm_yday = 0;
	tm->tm_isdst = 0;

	/*
	 * Determine the day of week
	 */
	return rtc_calc_weekday(tm);
}
示例#29
0
/*
 *  determine the max days in month @mon of year @yy
 *  we add @yy parameter because of leap year
 *
 *  return the max days if OK, 0 if error
 */
int month_days(Date::Month mon, int yy)
{
    int max = 0;

    switch (mon) {
    case Date::feb:
	max = 28 + leapyear(yy);
	break;
    case Date::apr : case Date::jun: case Date::sep: case Date::nov:
	max = 30;
	break;
    case Date::jan: case Date::mar: case Date::may: case Date::jul: 
    case Date::aug: case Date::oct: case Date::dec:
	max = 31;
	break;
    default:
	break;
    }

    return max;
}
示例#30
0
bool is_date(int y, Date::Month  m, int d)
{
    // assume that y is valid

    if (d<=0) return false;            // d must be positive

    int days_in_month = 31;            // most months have 31 days

    switch (m) {
case Date::feb:                        // the length of February varies
    days_in_month = (leapyear(y))?29:28;
    break;
case Date::apr: case Date::jun: case Date::sep: case Date::nov:
    days_in_month = 30;                // the rest have 30 days
    break;
    }

    if (days_in_month<d) return false;

    return true;
}