⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tztime.c

📁 Android 一些工具
💻 C
📖 第 1 页 / 共 4 页
字号:
			leaps_thru_end_of(y - 1);		tdays -= ((time_t) newy - y) * DAYSPERNYEAR;		tdays -= leapdays;		y = newy;	}	{		register long	seconds;		seconds = tdays * SECSPERDAY + 0.5;		tdays = seconds / SECSPERDAY;		rem += seconds - tdays * SECSPERDAY;	}	/*	** Given the range, we can now fearlessly cast...	*/	idays = tdays;	rem += offset - corr;	while (rem < 0) {		rem += SECSPERDAY;		--idays;	}	while (rem >= SECSPERDAY) {		rem -= SECSPERDAY;		++idays;	}	while (idays < 0) {		if (increment_overflow(&y, -1))			return NULL;		idays += year_lengths[isleap(y)];	}	while (idays >= year_lengths[isleap(y)]) {		idays -= year_lengths[isleap(y)];		if (increment_overflow(&y, 1))			return NULL;	}	tmp->tm_year = y;	if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))		return NULL;	tmp->tm_yday = idays;	/*	** The "extra" mods below avoid overflow problems.	*/	tmp->tm_wday = EPOCH_WDAY +		((y - EPOCH_YEAR) % DAYSPERWEEK) *		(DAYSPERNYEAR % DAYSPERWEEK) +		leaps_thru_end_of(y - 1) -		leaps_thru_end_of(EPOCH_YEAR - 1) +		idays;	tmp->tm_wday %= DAYSPERWEEK;	if (tmp->tm_wday < 0)		tmp->tm_wday += DAYSPERWEEK;	tmp->tm_hour = (int) (rem / SECSPERHOUR);	rem %= SECSPERHOUR;	tmp->tm_min = (int) (rem / SECSPERMIN);	/*	** A positive leap second requires a special	** representation. This uses "... ??:59:60" et seq.	*/	tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;	ip = mon_lengths[isleap(y)];	for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))		idays -= ip[tmp->tm_mon];	tmp->tm_mday = (int) (idays + 1);	tmp->tm_isdst = 0;#ifdef TM_GMTOFF	tmp->TM_GMTOFF = offset;#endif /* defined TM_GMTOFF */	return tmp;}// ============================================================================#if 0char *ctime(timep)const time_t * const	timep;{/*** Section 4.12.3.2 of X3.159-1989 requires that**	The ctime function converts the calendar time pointed to by timer**	to local time in the form of a string. It is equivalent to**		asctime(localtime(timer))*/	return asctime(localtime(timep));}#endif// ============================================================================#if 0char *ctime_r(timep, buf)const time_t * const	timep;char *			buf;{	struct tm	mytm;	return asctime_r(localtime_r(timep, &mytm), buf);}#endif/*** Adapted from code provided by Robert Elz, who writes:**	The "best" way to do mktime I think is based on an idea of Bob**	Kridle's (so its said...) from a long time ago.**	It does a binary search of the time_t space. Since time_t's are**	just 32 bits, its a max of 32 iterations (even at 64 bits it**	would still be very reasonable).*/#ifndef WRONG#define WRONG	(-1)#endif /* !defined WRONG *//*** Simplified normalize logic courtesy Paul Eggert.*/static intincrement_overflow(number, delta)int *	number;int	delta;{	int	number0;	number0 = *number;	*number += delta;	return (*number < number0) != (delta < 0);}static intlong_increment_overflow(number, delta)long *	number;int	delta;{	long	number0;	number0 = *number;	*number += delta;	return (*number < number0) != (delta < 0);}static intnormalize_overflow(tensptr, unitsptr, base)int * const	tensptr;int * const	unitsptr;const int	base;{	register int	tensdelta;	tensdelta = (*unitsptr >= 0) ?		(*unitsptr / base) :		(-1 - (-1 - *unitsptr) / base);	*unitsptr -= tensdelta * base;	return increment_overflow(tensptr, tensdelta);}static intlong_normalize_overflow(tensptr, unitsptr, base)long * const	tensptr;int * const	unitsptr;const int	base;{	register int	tensdelta;	tensdelta = (*unitsptr >= 0) ?		(*unitsptr / base) :		(-1 - (-1 - *unitsptr) / base);	*unitsptr -= tensdelta * base;	return long_increment_overflow(tensptr, tensdelta);}static inttmcomp(atmp, btmp)register const struct tm * const atmp;register const struct tm * const btmp;{	register int	result;	if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&		(result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&		(result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&		(result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&		(result = (atmp->tm_min - btmp->tm_min)) == 0)			result = atmp->tm_sec - btmp->tm_sec;	return result;}static time_ttime2sub(tmp, funcp, offset, okayp, do_norm_secs, sp)struct tm * const	tmp;struct tm * (* const	funcp) P((const time_t*, long, struct tm*,const struct state *sp));const long		offset;int * const		okayp;const int		do_norm_secs;const struct state *	sp;{	register int			dir;	register int			i, j;	register int			saved_seconds;	register long			li;	register time_t			lo;	register time_t			hi;	long				y;	time_t				newt;	time_t				t;	struct tm			yourtm, mytm;	*okayp = FALSE;	yourtm = *tmp;	if (do_norm_secs) {		if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,			SECSPERMIN))				return WRONG;	}	if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))		return WRONG;	if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))		return WRONG;	y = yourtm.tm_year;	if (long_normalize_overflow(&y, &yourtm.tm_mon, MONSPERYEAR))		return WRONG;	/*	** Turn y into an actual year number for now.	** It is converted back to an offset from TM_YEAR_BASE later.	*/	if (long_increment_overflow(&y, TM_YEAR_BASE))		return WRONG;	while (yourtm.tm_mday <= 0) {		if (long_increment_overflow(&y, -1))			return WRONG;		li = y + (1 < yourtm.tm_mon);		yourtm.tm_mday += year_lengths[isleap(li)];	}	while (yourtm.tm_mday > DAYSPERLYEAR) {		li = y + (1 < yourtm.tm_mon);		yourtm.tm_mday -= year_lengths[isleap(li)];		if (long_increment_overflow(&y, 1))			return WRONG;	}	for ( ; ; ) {		i = mon_lengths[isleap(y)][yourtm.tm_mon];		if (yourtm.tm_mday <= i)			break;		yourtm.tm_mday -= i;		if (++yourtm.tm_mon >= MONSPERYEAR) {			yourtm.tm_mon = 0;			if (long_increment_overflow(&y, 1))				return WRONG;		}	}	if (long_increment_overflow(&y, -TM_YEAR_BASE))		return WRONG;	yourtm.tm_year = y;	if (yourtm.tm_year != y)		return WRONG;	if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)		saved_seconds = 0;	else if (y + TM_YEAR_BASE < EPOCH_YEAR) {		/*		** We can't set tm_sec to 0, because that might push the		** time below the minimum representable time.		** Set tm_sec to 59 instead.		** This assumes that the minimum representable time is		** not in the same minute that a leap second was deleted from,		** which is a safer assumption than using 58 would be.		*/		if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))			return WRONG;		saved_seconds = yourtm.tm_sec;		yourtm.tm_sec = SECSPERMIN - 1;	} else {		saved_seconds = yourtm.tm_sec;		yourtm.tm_sec = 0;	}	/*	** Do a binary search (this works whatever time_t's type is).	*/	if (!TYPE_SIGNED(time_t)) {		lo = 0;		hi = lo - 1;	} else if (!TYPE_INTEGRAL(time_t)) {		if (sizeof(time_t) > sizeof(float))			hi = (time_t) DBL_MAX;		else	hi = (time_t) FLT_MAX;		lo = -hi;	} else {		lo = 1;		for (i = 0; i < (int) TYPE_BIT(time_t) - 1; ++i)			lo *= 2;		hi = -(lo + 1);	}	for ( ; ; ) {		t = lo / 2 + hi / 2;		if (t < lo)			t = lo;		else if (t > hi)			t = hi;		if ((*funcp)(&t, offset, &mytm, sp) == NULL) {			/*			** Assume that t is too extreme to be represented in			** a struct tm; arrange things so that it is less			** extreme on the next pass.			*/			dir = (t > 0) ? 1 : -1;		} else	dir = tmcomp(&mytm, &yourtm);		if (dir != 0) {			if (t == lo) {				++t;				if (t <= lo)					return WRONG;				++lo;			} else if (t == hi) {				--t;				if (t >= hi)					return WRONG;				--hi;			}			if (lo > hi)				return WRONG;			if (dir > 0)				hi = t;			else	lo = t;			continue;		}		if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)			break;		/*		** Right time, wrong type.		** Hunt for right time, right type.		** It's okay to guess wrong since the guess		** gets checked.		*/		/*		** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.		*/#ifdef ALL_STATE		if (sp == NULL)			return WRONG;#endif /* defined ALL_STATE */		for (i = sp->typecnt - 1; i >= 0; --i) {			if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)				continue;			for (j = sp->typecnt - 1; j >= 0; --j) {				if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)					continue;				newt = t + sp->ttis[j].tt_gmtoff -					sp->ttis[i].tt_gmtoff;				if ((*funcp)(&newt, offset, &mytm, sp) == NULL)					continue;				if (tmcomp(&mytm, &yourtm) != 0)					continue;				if (mytm.tm_isdst != yourtm.tm_isdst)					continue;				/*				** We have a match.				*/				t = newt;				goto label;			}		}		return WRONG;	}label:	newt = t + saved_seconds;	if ((newt < t) != (saved_seconds < 0))		return WRONG;	t = newt;	if ((*funcp)(&t, offset, tmp, sp))		*okayp = TRUE;	return t;}static time_ttime2(tmp, funcp, offset, okayp, sp)struct tm * const	tmp;struct tm * (* const	funcp) P((const time_t*, long, struct tm*,            const struct state* sp));const long		offset;int * const		okayp;const struct state *	sp;{	time_t	t;	/*	** First try without normalization of seconds	** (in case tm_sec contains a value associated with a leap second).	** If that fails, try with normalization of seconds.	*/	t = time2sub(tmp, funcp, offset, okayp, FALSE, sp);	return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE, sp);}static time_ttime1(tmp, funcp, offset, sp)struct tm * const	tmp;struct tm * (* const	funcp) P((const time_t *, long, struct tm *, const struct state* sp));const long		offset;const struct state *	sp;{	register time_t			t;	register int			samei, otheri;	register int			sameind, otherind;	register int			i;	register int			nseen;	int				seen[TZ_MAX_TYPES];	int				types[TZ_MAX_TYPES];	int				okay;	if (tmp->tm_isdst > 1)		tmp->tm_isdst = 1;	t = time2(tmp, funcp, offset, &okay, sp);#define PCTS 1#ifdef PCTS	/*	** PCTS code courtesy Grant Sullivan.	*/	if (okay)		return t;	if (tmp->tm_isdst < 0)		tmp->tm_isdst = 0;	/* reset to std and try again */#endif /* defined PCTS */#ifndef PCTS	if (okay || tmp->tm_isdst < 0)		return t;#endif /* !defined PCTS */	/*	** We're supposed to assume that somebody took a time of one type	** and did some math on it that yielded a "struct tm" that's bad.	** We try to divine the type they started from and adjust to the	** type they need.	*/	/*	** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.	*/#ifdef ALL_STATE	if (sp == NULL)		return WRONG;#endif /* defined ALL_STATE */	for (i = 0; i < sp->typecnt; ++i)		seen[i] = FALSE;	nseen = 0;	for (i = sp->timecnt - 1; i >= 0; --i)		if (!seen[sp->types[i]]) {			seen[sp->types[i]] = TRUE;			types[nseen++] = sp->types[i];		}	for (sameind = 0; sameind < nseen; ++sameind) {		samei = types[sameind];		if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)			continue;		for (otherind = 0; otherind < nseen; ++otherind) {			otheri = types[otherind];			if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)				continue;			tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -					sp->ttis[samei].tt_gmtoff;			tmp->tm_isdst = !tmp->tm_isdst;			t = time2(tmp, funcp, offset, &okay, sp);			if (okay)				return t;			tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -					sp->ttis[samei].tt_gmtoff;			tmp->tm_isdst = !tmp->tm_isdst;		}	}	return WRONG;}// ============================================================================time_tmktime_tz(struct tm * const	tmp, char const * tz){    struct state st;    if (tzload(tz, &st, TRUE) != 0) {        // not sure what's best here, but for now, we fall back to gmt        gmtload(&st);    }	return time1(tmp, localsub, 0L, &st);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -