There appears to be a bug in strftime such that the last digit is chopped off the seconds.
I built a gprolog instance with a time function primitive (to get around 27bit ints in gprolog/386) so: Bool c_adstm(char *timeS0, long secs, char **newtm) { struct tm Tm; char *sZnewtm; size_t Xlen0 = 0; time_t tm; Tm.tm_isdst = -1; Xlen0 = strlen(timeS0); sZnewtm = *newtm = (char*)Malloc(Xlen0+1); if(strptime(timeS0,"%Y%m%d%H%M%S",&Tm)==NULL) return FALSE; tm = mktime(&Tm) ; fprintf(stdout,"B: %ld\n",tm); tm = tm + secs; fprintf(stdout,"C: %ld\n",tm); if(localtime_r(&tm,&Tm)==NULL) return FALSE; // if(strftime(sZnewtm,Xlen0,"%Y%m%d%H%M%S",&Tm)==0) return FALSE; strftime(sZnewtm,Xlen0,"%Y%m%d%H%M%S",&Tm) ; fprintf(stdout,"E\n"); return TRUE; } When I run this on OpenBSD I get | ?- c_adstm("20080101010101",30,X),atom_codes(XA,X). B: 1199174461 C: 1199174491 E X = [50,48,48,56,48,49,48,49,48,49,48,49,51] XA = '2008010101013' yes | ?- But on FreeBSD I get the correct (expected) output: | ?- c_adstm("20080101010101",30,X),atom_codes(XA,X). B: 1199170861 C: 1199170891 E X = [50,48,48,56,48,49,48,49,48,49,48,49,51,49] XA = '20080101010131' yes | ?- I have entered a bug with sendbug/1, but it told me some (unspecified) fields were blank so I'm not sure if it went in. Also, could anyone tell me where the source for the strftime & strptime functions is located? Thanks, Dhu