The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com




View Single Post in the UNIX and Linux Forums - Click on the Thread or Permalink to View Entire Thread -->
  #2 (permalink)  
Old 11-18-2007
prowla prowla is offline
Read Only
  
 

Join Date: Nov 2007
Posts: 165
Aha - date arithmetic.
You could set up an array with 28/29/30/31 days lookups for the months and leapyear calculations.

I once wrote a C program called timecalc. Here it is, if it's of any use:
Code:
/*
 * Name:
 *	timecalc.c
 *
 * Purpose:
 *	Time calculations.
 #
 * Usage:
 *	timecalc [+|-]n [seconds|minutes|hours|days|weeks]
 *
 * History:
 *	050713	GZB	Original.
 *
 */

static char *gsVersion="@(#)timecalc.c GZB 050713";

#include <time.h>
#include <stdlib.h>
#include <sys/time.h>

int gbDebug=0;
int gbVerbose=0;
double gfTimeDiff=0;	/* What to change the time by. */
int giTimeDiff=0;	/* What to change the time by. */
int giTimeUnits=1;	/* Time units scaled to seconds. */
char gsDateSep[10]="/";	/* Date separator. */
char gsTimeSep[10]=":";	/* Time separator. */
char gsDtoTSep[10]=" ";	/* Separator between date & time. */


Usage()
{
	printf("usage: timecalc [+|-]n [seconds|minutes|hours|days|weeks]\n");
	exit(1);
}


CommandArgs(argc,argv)
	int argc;
	char **argv;
{
	int i;

	if (gbDebug) printf("CommandArgs()\n");

	for ( i=1; i<argc; i++ )
	{
		if (gbDebug) printf("%d/%d\n", i, argc);

		switch (*argv[i])
		{
			case '+': gfTimeDiff=atof(argv[i]+1); break;
			case '-': gfTimeDiff=-atof(argv[i]+1); break;
			case 's': giTimeUnits=1; break;
			case 'm': giTimeUnits=60; break;
			case 'h': giTimeUnits=60*60; break;
			case 'd': giTimeUnits=60*60*24; break;
			case 'w': giTimeUnits=60*60*24*7; break;
			case 'D': gbDebug=1; break;
			case 'V': gbVerbose=1; break;
			/* case 'T': *gsDateSep='\0'; *gsTimeSep='\0'; break; */
			case 'T': strcpy(gsDateSep,""); strcpy(gsTimeSep,""); break;
			default: Usage(); break;
		}
	}

	/*
	giTimeDiff *= giTimeUnits;
	if (gbDebug) printf( "%d %d\n", giTimeDiff, giTimeUnits);
	*/

	giTimeDiff = (int)(gfTimeDiff * (double)giTimeUnits);
	if (gbDebug) printf( "%d %f %d\n", giTimeDiff, gfTimeDiff, giTimeUnits);
}


PrintTime(tp)
	struct tm *tp;
{
	printf("%04d%s%02d%s%02d%s%02d%s%02d%s%02d",
		tp->tm_year+1900,
		gsDateSep,
		tp->tm_mon+1,
		gsDateSep,
		tp->tm_mday,
		gsDtoTSep,
		tp->tm_hour,
		gsTimeSep,
		tp->tm_min,
		gsTimeSep,
		tp->tm_sec
		);
}


main(argc,argv)
	int argc;
	char **argv;
{
	time_t	t;
	time_t	tnew;
	struct tm *tp;

	t = (time_t)time((time_t *)0);
	if (gbDebug) printf("Seconds since epoch = %d\n", t);

	CommandArgs(argc,argv);

	tnew = t + giTimeDiff;
	if (gbDebug) printf("Seconds adjusted by %d = %d\n", giTimeDiff, tnew);

	if (gbVerbose)
	{
		tp = localtime(&t);
		PrintTime(tp);
		printf("\n");
		/* printf(" -> "); */
	}

	tp = localtime(&tnew);
	PrintTime(tp);
	printf("\n");
}
All usual disclaimers, non-warranties, and so-on apply!

Alternatively, you could try and make some clever use of the "cal" (calendar) program.