Corrected the interpretation of user supplied ECMA-119 timestamp strings

This commit is contained in:
2013-03-12 19:49:07 +00:00
parent bb79d95bcc
commit 108806ddca
6 changed files with 113 additions and 65 deletions

View File

@ -457,14 +457,20 @@ ex:
int Decode_ecma119_format(struct tm *erg, char *text, int flag)
/* YYYYMMDDhhmmsscc */
/* YYYYMMDDhhmmsscc[LOC] */
/* 2010040711405800 */
{
int i, l, num;
int i, l, num, utc= 1;
memset(erg, 0, sizeof(*erg));
erg->tm_isdst= -1;
l= strlen(text);
if(l == 19) {
if(strcmp(text + 16, "LOC") != 0)
return(0);
utc= 0;
l= 16;
}
if(l != 16)
return(0);
for(i= 0; i < l; i++)
@ -491,7 +497,7 @@ int Decode_ecma119_format(struct tm *erg, char *text, int flag)
erg->tm_sec= 10*(text[12]-'0')+text[13]-'0';
if(erg->tm_sec > 59)
return(0);
return(1);
return(1 + !utc);
}
@ -575,7 +581,7 @@ time_t Decode_timestring(char *code, time_t *date, int flag)
char scale_chr;
double value,seconds;
struct tm result_tm;
int seconds_valid= 0;
int seconds_valid= 0, ret;
*date= 0;
if(code[0]=='-' || code[0]=='+' || code[0]=='=' || code[0]=='@'){
@ -627,10 +633,21 @@ time_t Decode_timestring(char *code, time_t *date, int flag)
seconds= mktime(&result_tm);
seconds_valid= 1;
goto completed;
} else if(Decode_ecma119_format(&result_tm, code, 0)>0) {
/* YYYYMMDDhhmmsscc */
/* 2010040711405800 */
} else if((ret= Decode_ecma119_format(&result_tm, code, 0)) > 0) {
/* YYYYMMDDhhmmsscc[UTC] */
/* 2010040711405800UTC */
seconds= mktime(&result_tm);
if(ret == 1) {
#ifdef HAVE_TM_GMTOFF
seconds+= result_tm.tm_gmtoff;
#else
if(result_tm.tm_isdst < 0)
result_tm.tm_isdst = 0;
seconds-= timezone - result_tm.tm_isdst * 3600;
#endif
}
seconds_valid= 1;
goto completed;
}