arpadate.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 173 行

C
173
字号
#ifndef lintstatic	char	*sccsid = "@(#)arpadate.c	4.1	(ULTRIX)	7/2/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1987 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************/# include "conf.h"# include <time.h># include <sys/types.h># include "useful.h"/***  ARPADATE -- Create date in ARPANET format****	Parameters:**		ud -- unix style date string.  if NULL, one is created.****	Returns:**		pointer to an ARPANET date field****	Side Effects:**		none****	WARNING:**		date is stored in a local buffer -- subsequent**		calls will overwrite.****	Bugs:**		Timezone is computed from local time, rather than**		from whereever (and whenever) the message was sent.**		To do better is very hard.****		Some sites are now inserting the timezone into the**		local date.  This routine should figure out what**		the format is and work appropriately.*/char *arpadate(ud)	register char *ud;{	register char *p;	register char *q;	register int off;	register int i;	register struct tm *lt;	time_t t;	struct tm gmt;	static char b[40];	extern struct tm *localtime(), *gmtime();	extern char *ctime();	extern time_t time();	/*	**  Get current time.	**	This will be used if a null argument is passed and	**	to resolve the timezone.	*/	(void) time(&t);	if (ud == NULL)		ud = ctime(&t);	/*	**  Crack the UNIX date line in a singularly unoriginal way.	*/	q = b;	p = &ud[0];		/* Mon */	*q++ = *p++;	*q++ = *p++;	*q++ = *p++;	*q++ = ',';	*q++ = ' ';	p = &ud[8];		/* 16 */	if (*p == ' ')		p++;	else		*q++ = *p++;	*q++ = *p++;	*q++ = ' ';	p = &ud[4];		/* Sep */	*q++ = *p++;	*q++ = *p++;	*q++ = *p++;	*q++ = ' ';	p = &ud[22];		/* 79 */	*q++ = *p++;	*q++ = *p++;	*q++ = ' ';	p = &ud[11];		/* 01:03:52 */	for (i = 8; i > 0; i--)		*q++ = *p++;	/*	 * should really get the timezone from the time in "ud" (which	 * is only different if a non-null arg was passed which is different	 * from the current time), but for all practical purposes, returning	 * the current local zone will do (its all that is ever needed).	 */	gmt = *gmtime(&t);	lt = localtime(&t);	off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;	/* assume that offset isn't more than a day ... */	if (lt->tm_year < gmt.tm_year)		off -= 24 * 60;	else if (lt->tm_year > gmt.tm_year)		off += 24 * 60;	else if (lt->tm_yday < gmt.tm_yday)		off -= 24 * 60;	else if (lt->tm_yday > gmt.tm_yday)		off += 24 * 60;	*q++ = ' ';	if (off == 0) {		*q++ = 'G';		*q++ = 'M';		*q++ = 'T';	} else {		if (off < 0) {			off = -off;			*q++ = '-';		} else			*q++ = '+';		if (off >= 24*60)		/* should be impossible */			off = 23*60+59;		/* if not, insert silly value */		*q++ = (off / 600) + '0';		*q++ = (off / 60) % 10 + '0';		off %= 60;		*q++ = (off / 10) + '0';		*q++ = (off % 10) + '0';	}	*q = '\0';	return (b);}

⌨️ 快捷键说明

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