Преобразование строковой даты в time_t

Преобразование строковой даты в time_t

Преобразование строковой даты в time_t

Если вам необходимо преобразовать строку, содержащую дату в формате » Fri, 6 Dec 2002 13:03:56 GMT» (это достаточно распространенный формат, например в HTTP заголовках так пишется дата в полях Last-Modified и Date) то можете воспользоваться следующей функцией:

  1. /* Возвращает time_t для строки в формате: Mon, 07 Apr 2003 12:58:39 GMT */
  2. unsigned long stimegm(char *dt) {
  3. if (!dt) return(0);
  4.  
  5. char weekday[4],month[4];
  6. unsigned long DD=0,YY=0,MM=0,hh=0,mm=0,ss=0;
  7.  
  8. sscanf(dt,"%3s, %u %3s %u %u:%u:%u GMT",&weekday,&DD,&month,&YY,&hh,&mm,&ss);
  9.  
  10. if (strcmp(month,"Jan")==0) MM=1;
  11. if (strcmp(month,"Feb")==0) MM=2;
  12. if (strcmp(month,"Mar")==0) MM=3;
  13. if (strcmp(month,"Apr")==0) MM=4;
  14. if (strcmp(month,"May")==0) MM=5;
  15. if (strcmp(month,"Jun")==0) MM=6;
  16. if (strcmp(month,"Jul")==0) MM=7;
  17. if (strcmp(month,"Aug")==0) MM=8;
  18. if (strcmp(month,"Sep")==0) MM=9;
  19. if (strcmp(month,"Oct")==0) MM=10;
  20. if (strcmp(month,"Nov")==0) MM=11;
  21. if (strcmp(month,"Dec")==0) MM=12;
  22.  
  23. // Далее идет код Сергея Сидорина
  24. unsigned long days = ((YY-1970)*(365+365+366+365)+1)/4 + DD - 1;
  25. switch (MM) {
  26. case 2: days += 31; break;
  27. case 3: days += 31+28; break;
  28. case 4: days += 31+28+31; break;
  29. case 5: days += 31+28+31+30; break;
  30. case 6: days += 31+28+31+30+31; break;
  31. case 7: days += 31+28+31+30+31+30; break;
  32. case 8: days += 31+28+31+30+31+30+31; break;
  33. case 9: days += 31+28+31+30+31+30+31+31; break;
  34. case 10: days += 31+28+31+30+31+30+31+31+30; break;
  35. case 11: days += 31+28+31+30+31+30+31+31+30+31; break;
  36. case 12: days += 31+28+31+30+31+30+31+31+30+31+30; break;
  37. }
  38. if ( (MM >= 3) && (YY%4 == 0) )
  39. days ++;
  40. return days*24*3600 + hh*3600 + mm*60 + ss;
  41. }

Download this code: stimegm.cpp

Вообще-то есть три функции, способные заменить эту, но они не доступны во всех операционных системах.

  Windows Linux FreeBSD
strptime() + +
timegm() +
mktime() + + +

P.S. Функция не преобразовывает GMT время в ваше локальное. Для этого вы можете воспользоваться функцией localtime()

Комментарии