/* 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; }
/* 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; }
/* 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; }
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; }
u16 year_to_day(u16 year) { if (leapyear(year)) return 366; else return 365; }
int copDaysOfYear( int cY ) { int y = cY - 1995 + 2003 + 1; /* 最後の + 1 は 閏年を when.exe に 合わせるための補正 */ return ( leapyear(y) ? 366 : 365 ); }
u16 month_to_day(u16 year,u8 month) { if (leapyear(year)) return smonth_tab2[month]; else return smonth_tab1[month]; }
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); }
// 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; }
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 */ }
u8 nowmonth(u8 nmonth,u16 nyear) { if (leapyear(nyear)) return month_tab2[nmonth-1]; else return month_tab1[nmonth-1]; }
int main() { freopen("output.txt","w",stdout); int i=0; for(i=1900;i<2100;i++) leapyear(i); return 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; }
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]; }
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; }
void main(int n) { int y; y = 1889; while (y < n) { y = y + 1; if (leapyear(y)) print y; } }
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()
// 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; }
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; };
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; }
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; }
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 }
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; } }
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; }
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; }
/*----------------------------------------------------------------------------*/ 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; }
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); }
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); }
/* * 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; }
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; }