Преобразование строковой даты в time_t
Если вам необходимо преобразовать строку, содержащую дату в формате » Fri, 6 Dec 2002 13:03:56 GMT» (это достаточно распространенный формат, например в HTTP заголовках так пишется дата в полях Last-Modified и Date) то можете воспользоваться следующей функцией:
/* Возвращает time_t для строки в формате: Mon, 07 Apr 2003 12:58:39 GMT */
unsigned long stimegm(char *dt) {
if (!dt) return(0);
char weekday[4],month[4];
unsigned long DD=0,YY=0,MM=0,hh=0,mm=0,ss=0;
sscanf(dt,"%3s, %u %3s %u %u:%u:%u GMT",&weekday,&DD,&month,&YY,&hh,&mm,&ss);
if (strcmp(month,"Jan")==0) MM=1;
if (strcmp(month,"Feb")==0) MM=2;
if (strcmp(month,"Mar")==0) MM=3;
if (strcmp(month,"Apr")==0) MM=4;
if (strcmp(month,"May")==0) MM=5;
if (strcmp(month,"Jun")==0) MM=6;
if (strcmp(month,"Jul")==0) MM=7;
if (strcmp(month,"Aug")==0) MM=8;
if (strcmp(month,"Sep")==0) MM=9;
if (strcmp(month,"Oct")==0) MM=10;
if (strcmp(month,"Nov")==0) MM=11;
if (strcmp(month,"Dec")==0) MM=12;
// Далее идет код Сергея Сидорина
unsigned long days = ((YY-1970)*(365+365+366+365)+1)/4 + DD - 1;
switch (MM) {
case 2: days += 31; break;
case 3: days += 31+28; break;
case 4: days += 31+28+31; break;
case 5: days += 31+28+31+30; break;
case 6: days += 31+28+31+30+31; break;
case 7: days += 31+28+31+30+31+30; break;
case 8: days += 31+28+31+30+31+30+31; break;
case 9: days += 31+28+31+30+31+30+31+31; break;
case 10: days += 31+28+31+30+31+30+31+31+30; break;
case 11: days += 31+28+31+30+31+30+31+31+30+31; break;
case 12: days += 31+28+31+30+31+30+31+31+30+31+30; break;
}
if ( (MM >= 3) && (YY%4 == 0) )
days ++;
return days*24*3600 + hh*3600 + mm*60 + ss;
}
Download this code: stimegm.cpp
Вообще-то есть три функции, способные заменить эту, но они не доступны во всех операционных системах.
Windows | Linux | FreeBSD | |
strptime() | — | + | + |
timegm() | — | — | + |
mktime() | + | + | + |
P.S. Функция не преобразовывает GMT время в ваше локальное. Для этого вы можете воспользоваться функцией localtime()
Комментарии