示例#1
0
void
clock_ts_to_ct(struct timespec *ts, struct clocktime *ct)
{
	time_t i, year, days;
	time_t rsec;	/* remainder seconds */
	time_t secs;

	secs = ts->tv_sec;
	days = secs / SECDAY;
	rsec = secs % SECDAY;

	ct->dow = day_of_week(days);

	/* Subtract out whole years, counting them in i. */
	for (year = POSIX_BASE_YEAR; days >= days_in_year(year); year++)
		days -= days_in_year(year);
	ct->year = year;

	/* Subtract out whole months, counting them in i. */
	for (i = 1; days >= days_in_month(year, i); i++)
		days -= days_in_month(year, i);
	ct->mon = i;

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

	/* Hours, minutes, seconds are easy */
	ct->hour = rsec / 3600;
	rsec = rsec % 3600;
	ct->min  = rsec / 60;
	rsec = rsec % 60;
	ct->sec  = rsec;
	ct->nsec = ts->tv_nsec;
	if (ct_debug) {
		printf("ts_to_ct(%ld.%09ld) = ",
		    (long)ts->tv_sec, (long)ts->tv_nsec);
		print_ct(ct);
		printf("\n");
	}

	KASSERT(ct->year >= 0 && ct->year < 10000,
	    ("year %d isn't a 4 digit year", ct->year));
	KASSERT(ct->mon >= 1 && ct->mon <= 12,
	    ("month %d not in 1-12", ct->mon));
	KASSERT(ct->day >= 1 && ct->day <= 31,
	    ("day %d not in 1-31", ct->day));
	KASSERT(ct->hour >= 0 && ct->hour <= 23,
	    ("hour %d not in 0-23", ct->hour));
	KASSERT(ct->min >= 0 && ct->min <= 59,
	    ("minute %d not in 0-59", ct->min));
	/* Not sure if this interface needs to handle leapseconds or not. */
	KASSERT(ct->sec >= 0 && ct->sec <= 60,
	    ("seconds %d not in 0-60", ct->sec));
}
示例#2
0
int
clock_ct_to_ts(struct clocktime *ct, struct timespec *ts)
{
	time_t secs;
	int i, year, days;

	year = ct->year;

	if (ct_debug) {
		printf("ct_to_ts(");
		print_ct(ct);
		printf(")");
	}

	/* Sanity checks. */
	if (ct->mon < 1 || ct->mon > 12 || ct->day < 1 ||
	    ct->day > days_in_month(year, ct->mon) ||
	    ct->hour > 23 ||  ct->min > 59 || ct->sec > 59 ||
	    ct->year > 2037) {		/* time_t overflow */
		if (ct_debug)
			printf(" = EINVAL\n");
		return (EINVAL);
	}

	/*
	 * 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);

	/* Months */
	for (i = 1; i < ct->mon; i++)
	  	days += days_in_month(year, i);
	days += (ct->day - 1);

	/* Add hours, minutes, seconds. */
	secs = ((days * 24 + ct->hour) * 60 + ct->min) * 60 + ct->sec;

	ts->tv_sec = secs;
	ts->tv_nsec = ct->nsec;
	if (ct_debug)
		printf(" = %ld.%09ld\n", (long)ts->tv_sec, (long)ts->tv_nsec);
	return (0);
}
示例#3
0
void
clock_ts_to_ct(struct timespec *ts, struct clocktime *ct)
{
	int i, year, days;
	time_t rsec;	/* remainder seconds */
	time_t secs;

	secs = ts->tv_sec;
	days = secs / SECDAY;
	rsec = secs % SECDAY;

	ct->dow = day_of_week(days);

	/* Subtract out whole years, counting them in i. */
	for (year = POSIX_BASE_YEAR; days >= days_in_year(year); year++)
		days -= days_in_year(year);
	ct->year = year;

	/* Subtract out whole months, counting them in i. */
	for (i = 1; days >= days_in_month(year, i); i++)
		days -= days_in_month(year, i);
	ct->mon = i;

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

	/* Hours, minutes, seconds are easy */
	ct->hour = rsec / 3600;
	rsec = rsec % 3600;
	ct->min  = rsec / 60;
	rsec = rsec % 60;
	ct->sec  = rsec;
	ct->nsec = ts->tv_nsec;
	if (ct_debug) {
		printf("ts_to_ct(%ld.%09ld) = ",
		    (long)ts->tv_sec, (long)ts->tv_nsec);
		print_ct(ct);
		printf("\n");
	}
}