Code:
/*
** DIFFDATE F.P.Murphy Feb 26th, 2008
**
** USAGE: diffdate [-d] -f dateformat startdate finishdate
**
** -d turn on debugging
** -f format strings per strptime(2) to match inputted start and finish dates
**
** OUTPUT: Prints difference between startdate and finishdate as HH:MM:SS
** Handles up to 99 hrs difference as currently written
**
** EXAMPLE: diffdate -f "%a, %b %d, %Y %T %p" "Tue, Feb 19, 2008 08:00:02 PM" "Wed, Feb 20, 2008 02:19:09 AM"
*/
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int
main(int argc, char* argv[])
{
struct tm tm1, tm2;
char buf[50];
char format[50];
char startdate[80];
char finishdate[80];
time_t t1, t2;
long diff;
int secs;
int mins;
int hours;
int c;
extern char *optarg;
extern int optind, optopt;
int debug = 0;
int errflg = 0;
while ((c = getopt(argc, argv, "df:h")) != -1) {
switch(c) {
case 'd':
debug = 1;
break;
case 'f':
strcpy(format, optarg);
break;
case 'h':
errflg++;
break;
case '?':
fprintf(stderr, "Unknown option: -%c\n", optopt);
errflg++;
}
}
if (errflg || (argc - optind != 2)) {
fprintf(stderr, "Usage: diffdate [-d] -f format startdate finishdate\n");
exit(2);
}
strcpy(startdate, argv[optind]);
optind++;
strcpy(finishdate, argv[optind]);
if (debug) {
fprintf(stderr, "Format: %s\n", format);
fprintf(stderr, "Start Date: %s\n", startdate);
fprintf(stderr, "Finish Date: %s\n", finishdate);
}
if (!strptime(startdate, format, &tm1)) {
fprintf(stderr, "strptime() error\n");
exit(1);
}
strftime(buf, 50, "%a %Y %H:%M:%S", &tm1);
if (!strptime(finishdate, format, &tm2)) {
fprintf(stderr, "strptime() error\n");
exit(1);
}
strftime(buf, 50, "%a %Y %H:%M:%S", &tm2);
if (((t1 = mktime(&tm1)) == -1) || ((t2 = mktime(&tm2)) == -1)) {
fprintf(stderr, "mktime() error\n");
exit(1);
}
diff = t2 - t1;
if (diff < 0)
diff = t1 - t2;
if (debug) {
printf("Start Date: seconds since Epoch: %ld\n", (long) t1);
printf("Finish Date: seconds since Epoch: %ld\n", (long) t2);
printf("Difference in seconds: %ld\n", (long) diff);
}
secs = diff % 60;
mins = diff % (60 * 60) / 60;
hours = diff / (60 * 60);
printf("%02d:%02d:%02d\n", hours, mins, secs);
}