Xref: utzoo comp.lang.c:35342 comp.unix.programmer:868 comp.unix.questions:28136 Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!bria!mike Newsgroups: comp.lang.c,comp.unix.programmer,comp.unix.questions Subject: Re: need "yy-ddd-hh:mm:ss ==> (time_t) clock" converter Message-ID: <368@bria> Date: 19 Jan 91 21:49:28 GMT References: Reply-To: mike@bria.UUCP (Michael Stefanik) Followup-To: comp.lang.c Distribution: comp Organization: Briareus Corporation, Los Angeles, CA Lines: 110 In article sunland.gsfc.nasa.gov!tsingle (Tim Singletary) writes: >Help! I need something to convert yy-ddd-hh:mm:ss (i.e. year, >day_of_year, hour, minute, second) to a unix-style >_number_of_seconds_since_00:00:00_GMT,_Jan._1,_1970_. I am doing this with the full knowledge that people are going to send me flaming mail about what an ugly solution this is, but ... here is a little ditty I wrote that seems to even work ... /* @(#)tmparse.c 1.1 parse a time specification */ #include #include #include #include #define ONE_DAY 86400L #define ONE_YEAR 31564800L #define ONE_THIRD 28800L int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; main() { long now; char buf[64]; for (;;) { printf("Enter date: "); if ( gets(buf) == NULL ) break; tmparse(buf,&now); printf("%s",ctime(&now)); } } long tmparse(buf,when) char *buf; long *when; { long date, now; int year = 1970, month = 0, day = 0; int hours = 0, mins = 0, secs = 0, count; char *ptr, *next; struct tm *lt; time(&now); lt = localtime(&now); if ( strchr(buf,'/') == NULL && strchr(buf,'-') == NULL ) { month = lt->tm_mon; day = lt->tm_mday - 1; year = lt->tm_year + 1900; next = buf; } else { month = atoi(strtok(buf,"/-")) - 1; day = atoi(strtok(NULL,"/-")) - 1; year = atoi(strtok(NULL," ")); next = NULL; if ( year == 0 ) year = lt->tm_year + 1900; else if ( year < 100 ) year += 1900; } if ( year < 1970 ) { *when = 0L; return(0L); } if ( (ptr = strtok(next,":")) != NULL ) { while ( isspace(*ptr) ) ++ptr; hours = atoi(ptr); mins = atoi(strtok(NULL,":")); secs = atoi(strtok(NULL,"")); } date = 0L; for ( count = 1970; count < year; count++) { date += ONE_YEAR; if ( count % 4 == 0 || count % 400 == 0 ) date += ONE_DAY; } date -= (year - 1971) * ONE_THIRD; for ( count = 0; count < month; count++) { date += mdays[count] * ONE_DAY; if ( count == 1 && (year % 4 == 0 || year % 400 == 0) ) date += ONE_DAY; } date += (day * ONE_DAY) + secs + (mins * 60) + (hours * 3600); lt = localtime(&date); date += (hours - lt->tm_hour) * 3600; *when = date; return(date); } -- Michael Stefanik, Systems Engineer (JOAT), Briareus Corporation UUCP: ...!uunet!bria!mike -- technoignorami (tek'no-ig'no-ram`i) a group of individuals that are constantly found to be saying things like "Well, it works on my DOS machine ..."