Пример #1
0
int
calculatesunlongitude30(int year, int degreeGMToffset, int *ichinesemonths)
{
	int m, d, h;
	double dec;
	double curL, prevL;
	int *pichinesemonths, *monthdays, *cumdays, i;
	int firstmonth330 = -1;

	cumdays = cumdaytab[isleap(year)];
	monthdays = mondaytab[isleap(year)];
	pichinesemonths = ichinesemonths;

	h = 0;
	sunpos(year - 1, 12, 31,
	    -24 * (degreeGMToffset / 360.0),
	    HOUR(h), MIN(h), SEC(h), 0.0, 0.0, &prevL, &dec);

	for (m = 1; m <= 12; m++) {
		for (d = 1; d <= monthdays[m]; d++) {
			for (h = 0; h < 4 * HOURSPERDAY; h++) {
				sunpos(year, m, d,
				    -24 * (degreeGMToffset / 360.0),
				    HOUR(h), MIN(h), SEC(h),
				    0.0, 0.0, &curL, &dec);
				if (curL < 180 && prevL > 180) {
					*pichinesemonths = cumdays[m] + d;
#ifdef DEBUG
printf("%04d-%02d-%02d %02d:%02d - %d %g\n",
    year, m, d, HOUR(h), MIN(h), *pichinesemonths, curL);
#endif
					    pichinesemonths++;
				} else {
					for (i = 0; i <= 360; i += 30)
						if (curL > i && prevL < i) {
							*pichinesemonths =
							    cumdays[m] + d;
#ifdef DEBUG
printf("%04d-%02d-%02d %02d:%02d - %d %g\n",
    year, m, d, HOUR(h), MIN(h), *pichinesemonths, curL);
#endif
							if (i == 330)
								firstmonth330 = *pichinesemonths;
							pichinesemonths++;
						}
				}
				prevL = curL;
			}
		}
	}
	*pichinesemonths = -1;
	return (firstmonth330);
}
Пример #2
0
struct tm *
gmtime(const time_t *clock)
{
	static struct tm	result;
	struct tm	*tmp;
	long		days;
	int		rem;
	long		y;
	long		newy;
	const int	*ip;

	tmp = &result;
	days = *clock / SECS_PER_DAY;
	rem = *clock % SECS_PER_DAY;
	while (rem < 0) {
		rem += SECS_PER_DAY;
		--days;
	}
	while (rem >= SECS_PER_DAY) {
		rem -= SECS_PER_DAY;
		++days;
	}
	tmp->tm_hour = (int)(rem / SECS_PER_HOUR);
	rem = rem % SECS_PER_HOUR;
	tmp->tm_min = (int)(rem / SECS_PER_MIN);
	tmp->tm_sec = (int)(rem % SECS_PER_MIN);
	tmp->tm_wday = (int)((EPOCH_WDAY + days) % DAYS_PER_WEEK);
	if (tmp->tm_wday < 0)
		tmp->tm_wday += DAYS_PER_WEEK;
	y = EPOCH_YEAR;

#define	LEAPS_THRU_END_OF(y)    ((y) / 4 - (y) / 100 + (y) / 400)

	while (days < 0 || days >= (long)__year_lengths[isleap(y)]) {
		newy = y + days / DAYS_PER_NYEAR;
		if (days < 0)
			--newy;
		days -= ((long)newy - (long)y) * DAYS_PER_NYEAR +
			LEAPS_THRU_END_OF(newy > 0 ? newy - 1L : newy) -
			LEAPS_THRU_END_OF(y > 0 ? y - 1L : y);
		y = newy;
	}

	tmp->tm_year = y - TM_YEAR_BASE;
	tmp->tm_yday = days;
	ip = __mon_lengths[isleap(y)];
	for (tmp->tm_mon = 0; days >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
		days = days - ip[tmp->tm_mon];
	tmp->tm_mday = (days + 1);
	tmp->tm_isdst = 0;
	return (tmp);
}
Пример #3
0
u_int32_t
ns_datetosecs(const char *cp, int *errp) {
	struct tm tim;
	u_int32_t result;
	int mdays, i;
	static const int days_per_month[12] =
		{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

	if (strlen(cp) != 14U) {
		*errp = 1;
		return (0);
	}
	*errp = 0;

	memset(&tim, 0, sizeof tim);
	tim.tm_year  = datepart(cp +  0, 4, 1990, 9999, errp) - 1900;
	tim.tm_mon   = datepart(cp +  4, 2,   01,   12, errp) - 1;
	tim.tm_mday  = datepart(cp +  6, 2,   01,   31, errp);
	tim.tm_hour  = datepart(cp +  8, 2,   00,   23, errp);
	tim.tm_min   = datepart(cp + 10, 2,   00,   59, errp);
	tim.tm_sec   = datepart(cp + 12, 2,   00,   59, errp);
	if (*errp)		/*%< Any parse errors? */
		return (0);

	/* 
	 * OK, now because timegm() is not available in all environments,
	 * we will do it by hand.  Roll up sleeves, curse the gods, begin!
	 */

#define SECS_PER_DAY    ((u_int32_t)24*60*60)
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)

	result  = tim.tm_sec;				/*%< Seconds */
	result += tim.tm_min * 60;			/*%< Minutes */
	result += tim.tm_hour * (60*60);		/*%< Hours */
	result += (tim.tm_mday - 1) * SECS_PER_DAY;	/*%< Days */
	/* Months are trickier.  Look without leaping, then leap */
	mdays = 0;
	for (i = 0; i < tim.tm_mon; i++)
		mdays += days_per_month[i];
	result += mdays * SECS_PER_DAY;			/*%< Months */
	if (tim.tm_mon > 1 && isleap(1900+tim.tm_year))
		result += SECS_PER_DAY;		/*%< Add leapday for this year */
	/* First figure years without leapdays, then add them in.  */
	/* The loop is slow, FIXME, but simple and accurate.  */
	result += (tim.tm_year - 70) * (SECS_PER_DAY*365); /*%< Years */
	for (i = 70; i < tim.tm_year; i++)
		if (isleap(1900+i))
			result += SECS_PER_DAY; /*%< Add leapday for prev year */
	return (result);
}
Пример #4
0
/* checks valid date */
int isvalid ( )
{
	int isleap ( long int ) ;

	if ( y <= 0 || m <= 0 || d <= 0 || m > 12 || y > 16384 ||
		 ( m == 2 && !isleap ( y ) && d > 28 ) ||
		 ( m == 2 && isleap ( y ) && d > 29 ) ||
		 ( ( m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10
		  || m == 12 ) && d > 31 ) || ( ( m == 4 || m == 6 || m == 9 ||
			 m == 11 ) && d > 30 ) )
		return 0 ;
	else
		return 1 ;
}
Пример #5
0
int
PGTYPEStimestamp_add_interval(timestamp * tin, interval * span, timestamp * tout)
{


	if (TIMESTAMP_NOT_FINITE(*tin))
		*tout = *tin;


	else
	{
		if (span->month != 0)
		{
			struct tm	tt,
					   *tm = &tt;
			fsec_t		fsec;


			if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) != 0)
				return -1;
			tm->tm_mon += span->month;
			if (tm->tm_mon > MONTHS_PER_YEAR)
			{
				tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR;
				tm->tm_mon = (tm->tm_mon - 1) % MONTHS_PER_YEAR + 1;
			}
			else if (tm->tm_mon < 1)
			{
				tm->tm_year += tm->tm_mon / MONTHS_PER_YEAR - 1;
				tm->tm_mon = tm->tm_mon % MONTHS_PER_YEAR + MONTHS_PER_YEAR;
			}


			/* adjust for end of month boundary problems... */
			if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
				tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);


			if (tm2timestamp(tm, fsec, NULL, tin) != 0)
				return -1;
		}


		*tin += span->time;
		*tout = *tin;
	}
	return 0;

}
Пример #6
0
//日期转天数偏移({0,1,1}第1天)
int date2int(date a){
 int ret=a.year*365+(a.year-1)/4-(a.year-1)/100+(a.year-1)/400,i;
 days[1]+=isleap(a.year);
 for (i=0;i<a.month-1;ret+=days[i++]);
 days[1]=28;
 return ret+a.day;
}
Пример #7
0
main () {

	int isleap(int year);
	void lyear_count(int start, int *week_days);
	void cyear_count(int start, int *week_days);
    FILE *fin  = fopen ("friday.in", "r");
    FILE *fout = fopen ("friday.out", "w");
	int year, start, n, n_count, day;
	static int week_days[6];

	year = 1900;
	start = 2;
	fscanf(fin, "%d", &n);
	for(n_count = 0; n_count < n; n_count++){
		if(isleap(year)==1){
			lyear_count(start, week_days);
			start = (start + 366) % 7;
		}else{
			cyear_count(start, week_days);
			start = (start + 365) % 7;
		}
		year++;
	}
	for(day = 0; day < 6; day++)
		fprintf(fout, "%d ", week_days[day]);
	fprintf(fout, "%d", week_days[day]);
	fprintf(fout, "\n");
	fclose(fin);
	fclose(fout);
    exit (0);
}
Пример #8
0
int
date_validate(char *str)
{
    int year, month, day, date;
    
    int mdays[2][13] = {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };

    if (strlen(str) < 8)
        return 0;

    date = atoi(str);
    year = date / 10000;
    month = date % 10000 / 100;
    day = date % 100;

    if (year < 2000 || year > 2013)
        return 0;
    if (month < 0 || month > 12)
        return 0;
    if (day < 0 || day > mdays[isleap(year)][month])
        return 0;
    return 1;
}
Пример #9
0
int day_of_year(int year, int month, int day){
	int i, leap;
	leap = isleap(year);
	for(i = 1; i < month; i++)
		day += daytab[leap][i];
	return day;
}
Пример #10
0
/* Calculate ISO 8601 week-based date */
LOCAL void update_gv(int gv[2], const struct tm *t)
{
	int k, v, d;

	/* Already calculated */
	if (gv[1] >= 0) return;

	k = (t -> tm_wday - t -> tm_yday + (53 * 7) + 6) % 7; /* day of the week of January 1st (Mon=0, Tue=1, ...) */
	v = ((k > 3) ? 1 : 0) + (t -> tm_yday + k + 1) / 7;

	if (v > 0) {
		/* The given date belongs to this week-based year */
		gv[0] = t->tm_year;
		gv[1] = v;
	}
	else {
		/* The given date belongs to the previous week-based year */
		d = 365 + (isleap(1900 + t -> tm_yday - 1) ? 1 : 0); /* the number of days for the previous year */
		k = ( k + (53 * 7) - d) % 7; /* day of the week of the previous January 1st */
		v = ((k > 3) ? 1 : 0) + (d + t -> tm_yday + k + 1) / 7;

		gv[0] = t->tm_year - 1;
		gv[1] = v;
	}
}
Пример #11
0
GIntBig CPLYMDHMSToUnixTime(const struct tm *brokendowntime)
{
  GIntBig days;
  int mon;
  
  if (brokendowntime->tm_mon < 0 || brokendowntime->tm_mon >= 12)
    return -1;
    
  /* Number of days of the current month */
  days = brokendowntime->tm_mday - 1;
  
  /* Add the number of days of the current year */
  const int* ip = mon_lengths[isleap(TM_YEAR_BASE + brokendowntime->tm_year)];
  for(mon=0;mon<brokendowntime->tm_mon;mon++)
      days += ip [mon];

  /* Add the number of days of the other years */
  days += (TM_YEAR_BASE + (GIntBig)brokendowntime->tm_year - EPOCH_YEAR) * DAYSPERNYEAR +
          LEAPS_THRU_END_OF(TM_YEAR_BASE + (GIntBig)brokendowntime->tm_year - 1) -
          LEAPS_THRU_END_OF(EPOCH_YEAR - 1);

  /* Now add the secondes, minutes and hours to the number of days since EPOCH */
  return brokendowntime->tm_sec +
         brokendowntime->tm_min * SECSPERMIN +
         brokendowntime->tm_hour * SECSPERHOUR +
         days * SECSPERDAY;
}
Пример #12
0
/* Yield the number of days in TM's month.  */
static int
month_days (struct tm const *tm)
{
   int m = tm->tm_mon;
   return (month_yday[m + 1] - month_yday[m]
           + (m == 1 && isleap (tm->tm_year + TM_YEAR_ORIGIN)));
}
Пример #13
0
void calendar(int yyyy, int mm) {
	Date start;
	start.yyyy = yyyy;
	start.mm = mm;
	start.dd = 1;
	int startday = getday(start);
	int enddate = DAYS_IN_MONTH[mm];
	if (isleap(yyyy) && mm == 1) {
		enddate++;
	}

	printf("    %d/%d    \n", yyyy, mm+1);
	printf("Sun Mon Tue Wed Thu Fri Sat\n");
	int i;
	for (i = 0; i < startday; i++) {
		printf("    ");
	}
	for (i = 1; i <= enddate; i++) {
		printf(" %02d ", i);
		startday++;
		if (startday % 7 == 0) {
			printf("\n");
		}
	}
	printf("\n");
}
Пример #14
0
VOID fsw_efi_decode_time(OUT EFI_TIME *EfiTime, IN UINT32 UnixTime)
{
    long        days, rem;
    int         y, newy, yleap;
    const int   *ip;

    ZeroMem(EfiTime, sizeof(EFI_TIME));

    days = UnixTime / SECSPERDAY;
    rem = UnixTime % SECSPERDAY;

    EfiTime->Hour = (UINT8) (rem / SECSPERHOUR);
    rem = rem % SECSPERHOUR;
    EfiTime->Minute = (UINT8) (rem / SECSPERMIN);
    EfiTime->Second = (UINT8) (rem % SECSPERMIN);

    y = EPOCH_YEAR;
    while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) {
        newy = y + days / DAYSPERNYEAR;
        if (days < 0)
            --newy;
        days -= (newy - y) * DAYSPERNYEAR +
            LEAPS_THRU_END_OF(newy - 1) -
            LEAPS_THRU_END_OF(y - 1);
        y = newy;
    }
    EfiTime->Year = (UINT16)y;
    ip = mon_lengths[yleap];
    for (EfiTime->Month = 0; days >= (long) ip[EfiTime->Month]; ++(EfiTime->Month))
        days = days - (long) ip[EfiTime->Month];
    EfiTime->Month++;  // adjust range to EFI conventions
    EfiTime->Day = (UINT8) (days + 1);
}
Пример #15
0
int datediff(Date d1, Date d2) {
	int diff = 0;
	if (d2.yyyy != d1.yyyy) {
		diff += (d2.yyyy - d1.yyyy) * DAYS_IN_YEAR;
		int ystart;
		int yend;
		if (d2.yyyy > d1.yyyy) {
			ystart = d1.yyyy;
			yend = d2.yyyy;
		} else {
			ystart = d2.yyyy;
			yend = d1.yyyy;
		}
		for (; ystart < yend; ystart++) {
			if (isleap(ystart)) {
				diff++;
			}
		}
	}

	int day2 = daysinyear(d2);
	int day1 = daysinyear(d1);

	return day2 - day1 + diff;
}
Пример #16
0
int main()
{
	func();//函数调用
	printf("欢迎使用main函数!\n");//函数调用
	printf("%g\n", func());//函数调用
	last();//函数调用
	printf("%d\n", isleap(2010));
	printf("%d\n", isleap(2008));
	printf("%d\n", days(2010,7));//调用函数,传递的数据叫实参
	print_diamond(5);
	print_diamond(4);
	//func(3,5,7,"hello",123.456);参数表为空,能通过编译
	//last(3);参数表是void,不能通过编译
	//printf("%d", print_diamond(3));返回类型是void,不带回结果
	return 0;
}
Пример #17
0
_tm GAgent_GetLocalTimeForm(uint32 time)
{
	time += Eastern8th;
	_tm tm;
	int x;
	int i=1970, mons[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	for(i=1970; time>0;)
	{
	    x=get_yeardays(i);
	    if(time >= x*DAY_SEC)
	    {
	        time -= x*DAY_SEC;
	        i++;
	    }
	    else
	    {
	        break;
	    }
	}
    tm.year = i;
    
	for(i=0; time>0;)
	{
        if (isleap(tm.year))
            mons[1]=29;       
        if(time >= mons[i]*DAY_SEC)
	    {
	        time -= mons[i]*DAY_SEC;
	        i++;
	    }
	    else
	    {
	        break;
	    }
	}
	mons[1]=28;
	tm.month = i+1;
   
    for(i=1; time>0;)
	{
        if(time >= DAY_SEC)
	    {
	        time -= DAY_SEC;
	        i++;
	    }
	    else
	    {
	        break;
	    }
	}	
	tm.day=i;
    
    tm.hour = time/(60*60);
    tm.minute = time%(60*60)/60;
    tm.second = time%60;
    	
	return tm;
}
Пример #18
0
int
days_in_year(int year)
{
	if (isleap(year))
		return (366);

	return (365);
}
Пример #19
0
void month_day(int year, int yearday, int *pmonth,  int *pday){
	int i, leap;
	leap = isleap(year);
	for(i = 1; yearday > daytab[leap][i]; i++)
		yearday -= daytab[leap][i];
	*pmonth = i;
	*pday = yearday;
}
Пример #20
0
int day_of_year(struct date *d) {
	int i, leap, day;
	day = d->day;
	leap = isleap(d->year);
	for (i = 1; i < d->month; i++)
		day += daytab[leap][i];
	return day;
}
Пример #21
0
/*Ripped from epoch2time() thc-vlogger*/
int epoch2time (const time_t *t, long int offset, struct vtm *tp)
{
  static const unsigned short int mon_yday[2][13] = {
   /* Normal years.  */
   { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
   /* Leap years.  */
   { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
  };

  long int days, rem, y;
  const unsigned short int *ip;

  days = *t / SECS_PER_DAY;
  rem = *t % SECS_PER_DAY;
  rem += offset;
  while (rem < 0) { 
    rem += SECS_PER_DAY;
    --days;
  }
  while (rem >= SECS_PER_DAY) {
    rem -= SECS_PER_DAY;
    ++days;
  }
  tp->tm_hour = rem / SECS_PER_HOUR;
  rem %= SECS_PER_HOUR;
  tp->tm_min = rem / 60;
  tp->tm_sec = rem % 60;
  y = 1970;

  while (days < 0 || days >= (isleap (y) ? 366 : 365)) {
    long int yg = y + days / 365 - (days % 365 < 0);
    days -= ((yg - y) * 365 + LEAPS_THRU_END_OF (yg - 1) - LEAPS_THRU_END_OF (y - 1));
    y = yg;
  }
  tp->tm_year = y - 1900;
  if (tp->tm_year != y - 1900)
    return 0;
  ip = mon_yday[isleap(y)];
    for (y = 11; days < (long int) ip[y]; --y)
      continue;
    days -= ip[y];
    tp->tm_mon = y;
    tp->tm_mday = days + 1;
    return 1;
}
Пример #22
0
int days(int year/*形参1*/, int month/*形参2*/)//参数表
{
	if(month==4||month==6||month==9||month==11)
		return 30;
	else if(month==2)
		return isleap(year)+28;
	else
		return 31;
}
Пример #23
0
Файл: date.c Проект: BigEd/wp34s
/* Test if a year is a leap year
 */
void date_isleap(enum nilop op) {
	int y, t = 0;
	decNumber x;

	getX(&x);
	if (! find_year(&x, &y))
		t = isleap(y);
	fin_tst(t);
}
Пример #24
0
int main(void) {
	int yy, mm, dd;
	printf("請輸入西元年月日:(yyyy/mm/dd)");
	scanf("%d/%d/%d", &yy, &mm, &dd);
	if (isleap(yy) == 1) {
		month[1] = 29;
	}
	printf("%d\n", day(yy, mm, dd) % 7);
}
Пример #25
0
int
days_in_mon(int m, int y)
{
	/*
	 * returns the number of days in month m of year y
	 * NOTE: m should be in the range 0 to 11
	 */
	return (dom[m] + (((m == 1) && isleap(y + YEAR)) ? 1 : 0));
}
Пример #26
0
char *parse_timestamp(char *s, time_t *tsp) {
  unsigned year, mon, day, hour, min, sec;

  if ((*s == '0' || *s == '-' || *s == ':') &&
      (ISSPACE(s[1]) || !s[1])) {
    *tsp = 0;
    ++s;
    SKIPSPACE(s);
    return s;
  }
  if (!(s = parse_tsp(s, &year, 1970, 2038, 4))) return NULL;
  if (!(s = parse_tsp(s, &mon, 1, 12, 2))) return NULL;
  mon -= 1;
  day = mon == 1 && isleap(year) ? 29 : mday[mon];
  if (!(s = parse_tsp(s, &day, 1, day, 2))) return NULL;
  hour = min = sec = 0;
  if (*s && !ISSPACE(*s))
    if (!(s = parse_tsp(s, &hour, 0, 23, 2))) return NULL;
  if (*s && !ISSPACE(*s))
    if (!(s = parse_tsp(s, &min, 0, 59, 2))) return NULL;
  if (*s && !ISSPACE(*s))
    if (!(s = parse_tsp(s, &sec, 0, 59, 2))) return NULL;
  if (*s) {
    if (!ISSPACE(*s)) return NULL;
    ++s; SKIPSPACE(s);
  }

  {
    unsigned y4 = (year / 4) - !(year & 3);
    unsigned y100 = y4 / 25;
    unsigned y400 = y100 / 4;
    day =
      365 * (year - 1970) +
      (y4 - 492) - (y100 - 19) + (y400 - 4) +
      day - 1;
    if (isleap(year) && mon > 1)
      ++day;
    while(mon)
      day += mday[--mon];
    *tsp = ((day * 24 + hour) * 60 + min) * 60 + sec;
  }

  return s;
}
Пример #27
0
char *
ctime(const time_t *clock)
{
	static const char wdays[][4] = {
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
	};
	static const char months[][4] = {
		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
	};
	static const u_int monthcnt[] = {
		31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
	};
	static char buf[64];
	int ss, mm, hh, wday, month, year;
	time_t tt = *clock;

	ss = tt % 60;
	tt /= 60;	/* minutes */
	mm = tt % 60;
	tt /= 60;	/* hours */
	hh = tt % 24;
	tt /= 24;	/* days */
	wday = (4 + tt) % 7;	/* weekday, 'twas thursday when time started */

	for (year = 1970; tt >= 365; year++)
		tt -= isleap(year)? 366: 365;

	tt++;	/* days are 1-based */

	for (month = 0; tt > monthcnt[month]; month++)
		tt -= monthcnt[month];

	if (month > 2 && isleap(year))
		tt--;

	/* no field widths in printf() */
	snprintf(buf, sizeof buf, "%s %s %d %d:%d:%d %d\n",
	    ((wday  < 0 || wday  >=  7)? "???": wdays[wday]),
	    ((month < 0 || month >= 12)? "???": months[month]),
	    (int)tt, hh, mm, ss, year);
	return buf;
}
Пример #28
0
static long ymd_to_scalar (unsigned yr, unsigned mo, unsigned day) {
  long scalar;

  scalar = day + months_to_days(mo);
  if (mo > 2) /* adjust if past February */
    scalar -= isleap(yr) ? 1 : 2;
  yr--;
  scalar += years_to_days(yr);
  return scalar;
}
Пример #29
0
static unsigned long int mkgmtime(const struct tm *ptmbuf)
{
    unsigned long int t;
    int year = ptmbuf->tm_year + ptmbuf->tm_mon / 12;
    t = yeartoseconds(year+1900);
    t += monthtoseconds(isleap(year+1900), ptmbuf->tm_mon % 12);
    t += (ptmbuf->tm_mday - 1) * 3600L * 24;
    t += ptmbuf->tm_hour * 3600L + ptmbuf->tm_min * 60L + ptmbuf->tm_sec;
    return t;
}
Пример #30
0
static void gps_mtk_time2itow(uint32_t  gps_date, uint32_t  gps_time,
                              int16_t *gps_week, uint32_t *gps_itow)
{
  /* convert UTC date/time to GPS week/itow, we have no idea about GPS
     leap seconds for now */
  uint16_t gps_msecond = gps_time % 1000;
  uint8_t  gps_second  = (gps_time / 1000) % 100;
  uint8_t  gps_minute  = (gps_time / 100000) % 100;
  uint8_t  gps_hour    = (gps_time / 10000000) % 100;
  uint16_t gps_year    = 2000 + (gps_date % 100);
  uint8_t  gps_month   = (gps_date / 100) % 100;
  uint8_t  gps_day     = (gps_date / 10000) % 100;
  int32_t  i, days;

  *gps_week = 0;
  *gps_itow = 0;

  /* sanity checks */
  if (gps_month > 12) { return; }
  if (gps_day > (DAYS_MONTH[gps_month] +
                 ((gps_month == 1) ? isleap(gps_year) : 0))) { return; }
  if (gps_hour > 23) { return; }
  if (gps_minute > 59) { return; }
  if (gps_second > 59) { return; }

  /* days since 6-JAN-1980 */
  days = -6;
  for (i = 1980; i < gps_year; i++) { days += (365 + isleap(i)); }

  /* add days in gps_year */
  for (i = 0; i < gps_month - 1; i++) {
    days += DAYS_MONTH[i] + ((i == 1) ? isleap(gps_year) : 0);
  }
  days += gps_day;

  /* convert */
  *gps_week = (uint16_t)(days / 7);
  *gps_itow = ((days % 7) * SECS_DAY +
               gps_hour * SECS_HOUR +
               gps_minute * SECS_MINUTE +
               gps_second) * 1000 +
              gps_msecond;
}