date.c

来自「unix v7是最后一个广泛发布的研究型UNIX版本」· C语言 代码 · 共 164 行

C
164
字号
/* * date : print date * date YYMMDDHHMM[.SS] : set date, if allowed * date -u ... : date in GMT */#include <time.h>#include <sys/types.h>#include <sys/timeb.h>#include <utmp.h>long	timbuf;char	*ap, *ep, *sp;int	uflag;char	*timezone();static	int	dmsize[12] ={	31,	28,	31,	30,	31,	30,	31,	31,	30,	31,	30,	31};struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}};char	*ctime();char	*asctime();struct	tm *localtime();struct	tm *gmtime();main(argc, argv)char *argv[];{	register char *tzn;	struct timeb info;	int wf, rc;	rc = 0;	ftime(&info);	if (argc>1 && argv[1][0]=='-' && argv[1][1]=='u') {		argc--;		argv++;		uflag++;	}	if(argc > 1) {		ap = argv[1];		if (gtime()) {			printf("date: bad conversion\n");			exit(1);		}		/* convert to GMT assuming local time */		if (uflag==0) {			timbuf += (long)info.timezone*60;			/* now fix up local daylight time */			if(localtime(&timbuf)->tm_isdst)				timbuf -= 60*60;		}		time(&wtmp[0].ut_time);		if(stime(&timbuf) < 0) {			rc++;			printf("date: no permission\n");		} else if ((wf = open("/usr/adm/wtmp", 1)) >= 0) {			time(&wtmp[1].ut_time);			lseek(wf, 0L, 2);			write(wf, (char *)wtmp, sizeof(wtmp));			close(wf);		}	}	if (rc==0)		time(&timbuf);	if(uflag) {		ap = asctime(gmtime(&timbuf));		tzn = "GMT";	} else {		struct tm *tp;		tp = localtime(&timbuf);		ap = asctime(tp);		tzn = timezone(info.timezone, tp->tm_isdst);	}	printf("%.20s", ap);	if (tzn)		printf("%s", tzn);	printf("%s", ap+19);	exit(rc);}gtime(){	register int i, year, month;	int day, hour, mins, secs;	struct tm *L;	char x;	ep=ap;	while(*ep) ep++;	sp=ap;	while(sp<ep) {		x = *sp;		*sp++ = *--ep;		*ep = x;	}	sp=ap;	time(&timbuf);	L=localtime(&timbuf);	secs = gp(-1);	if(*sp!='.') {		mins=secs;		secs=0;	} else {sp++;		mins = gp(-1);	}	hour = gp(-1);	day = gp(L->tm_mday);	month = gp(L->tm_mon+1);	year = gp(L->tm_year);	if(*sp)		return(1);	if( month<1 || month>12 ||	    day<1 || day>31 ||	    mins<0 || mins>59 ||	    secs<0 || secs>59)		return(1);	if (hour==24) {		hour=0; day++;	}	if (hour<0 || hour>23)		return(1);	timbuf = 0;	year += 1900;	for(i=1970; i<year; i++)		timbuf += dysize(i);	/* Leap year */	if (dysize(year)==366 && month >= 3)		timbuf++;	while(--month)		timbuf += dmsize[month-1];	timbuf += day-1;	timbuf = 24*timbuf + hour;	timbuf = 60*timbuf + mins;	timbuf = 60*timbuf + secs;	return(0);}gp(dfault){	register int c, d;	if(*sp==0)		return(dfault);	c = (*sp++)-'0';	d = (*sp ? (*sp++)-'0' : 0);	if(c<0 || c>9 || d<0 || d>9)		return(-1);	return(c+10*d);}

⌨️ 快捷键说明

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