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.