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

📄 ctime.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * This routine converts time as follows. * The epoch is 0000 Jan 1 1970 GMT. * The argument time is in seconds since then. * The localtime(t) entry returns a pointer to an array * containing *  seconds (0-59) *  minutes (0-59) *  hours (0-23) *  day of month (1-31) *  month (0-11) *  year-1970 *  weekday (0-6, Sun is 0) *  day of the year *  daylight savings flag * * The routine corrects for daylight saving * time and will work in any time zone provided * "timezone" is adjusted to the difference between * Greenwich and local standard time (measured in seconds). * In places like Michigan "daylight" must * be initialized to 0 to prevent the conversion * to daylight time. * There is a table which accounts for the peculiarities * undergone by daylight time in 1974-1975. * * The routine does not work * in Saudi Arabia which runs on Solar time. * * asctime(tvec)) * where tvec is produced by localtime * returns a ptr to a character string * that has the ascii time in the form *	Thu Jan 01 00:00:00 1970n0\\ *	01234567890123456789012345 *	0	  1	    2 * * ctime(t) just calls localtime, then asctime. */char	cbuf[26];int	dmsize[12]{	31,	28,	31,	30,	31,	30,	31,	31,	30,	31,	30,	31};int timezone	5*60*60;int tzname[]{	"EST",	"EDT",};int	daylight 1;	/* Allow daylight conversion *//* * The following table is used for 1974 and 1975 and * gives the day number of the first day after the Sunday of the * change. */struct {	int	daylb;	int	dayle;} daytab[] {	5,	333,	/* 1974: Jan 6 - last Sun. in Nov */	58,	303,	/* 1975: Last Sun. in Feb - last Sun in Oct */};#define	SEC	0#define	MIN	1#define	HOUR	2#define	MDAY	3#define	MON	4#define	YEAR	5#define	WDAY	6#define	YDAY	7#define	ISDAY	8ctime(at)int *at;{	return(asctime(localtime(at)));}localtime(tim)int tim[];{	register int *t, *ct, dayno;	int daylbegin, daylend;	int copyt[2];	t = copyt;	t[0] = tim[0];	t[1] = tim[1];	dpadd(t, -timezone);	ct = gmtime(t);	dayno = ct[YDAY];	daylbegin = 119;	/* last Sun in Apr */	daylend = 303;		/* Last Sun in Oct */	if (ct[YEAR]==74 || ct[YEAR]==75) {		daylbegin = daytab[ct[YEAR]-74].daylb;		daylend = daytab[ct[YEAR]-74].dayle;	}	daylbegin = sunday(ct, daylbegin);	daylend = sunday(ct, daylend);	if (daylight &&	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {		dpadd(t, 1*60*60);		ct = gmtime(t);		ct[ISDAY]++;	}	return(ct);}/* * The argument is a 0-origin day number. * The value is the day number of the first * Sunday on or after the day. */sunday(at, ad)int *at;{	register int *t, d;	t = at;	d = ad;	if (d >= 58)		d =+ dysize(t[YEAR]) - 365;	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);}gmtime(tim)int tim[];{	register int d0, d1;	register *tp;	static xtime[9];	extern int ldivr;	/*	 * break initial number into	 * multiples of 8 hours.	 * (28800 = 60*60*8)	 */	d0 = ldiv(tim[0], tim[1], 28800);	d1 = ldivr;	tp = &xtime[0];	/*	 * generate hours:minutes:seconds	 */	*tp++ = d1%60;	d1 =/ 60;	*tp++ = d1%60;	d1 =/ 60;	d1 =+ (d0%3)*8;	d0 =/ 3;	*tp++ = d1;	/*	 * d0 is the day number.	 * generate day of the week.	 */	xtime[WDAY] = (d0+4)%7;	/*	 * year number	 */	for(d1=70; d0 >= dysize(d1); d1++)		d0 =- dysize(d1);	xtime[YEAR] = d1;	xtime[YDAY] = d0;	/*	 * generate month	 */	if (dysize(d1)==366)		dmsize[1] = 29;	for(d1=0; d0 >= dmsize[d1]; d1++)		d0 =- dmsize[d1];	dmsize[1] = 28;	*tp++ = d0+1;	*tp++ = d1;	xtime[ISDAY] = 0;	return(xtime);}asctime(t)int *t;{	register char *cp, *ncp;	register int *tp;	cp = cbuf;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];	cp = cbuf;	*cp++ = *ncp++;	*cp++ = *ncp++;	*cp++ = *ncp++;	cp++;	tp = &t[4];	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];	*cp++ = *ncp++;	*cp++ = *ncp++;	*cp++ = *ncp++;	cp = ct_numb(cp, *--tp);	cp = ct_numb(cp, *--tp+100);	cp = ct_numb(cp, *--tp+100);	cp = ct_numb(cp, *--tp+100);	cp =+ 2;	cp = ct_numb(cp, t[YEAR]);	return(cbuf);}dysize(y){	if((y%4) == 0)		return(366);	return(365);}ct_numb(acp, n){	register char *cp;	cp = acp;	cp++;	if (n>=10)		*cp++ = (n/10)%10 + '0';	else		*cp++ = ' ';	*cp++ = n%10 + '0';	return(cp);}

⌨️ 快捷键说明

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