Преобразование строковой даты в 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()