2010-07-16 5 views
1

У меня есть ряд дат строк в формате: «30-05-2001»Формат даты в C++

string date1 = "30-05-2001"; 

Я хотел бы разобрать дату в день, месяц, год. Теперь просто сделать это будет просто вызов функции sscanf. Но я хотел бы исследовать другие possiblilties и от поиска в Интернете следующих функции от time.h было рекомендовано:

char *strptime(const char *buf, const char *format, struct tm *tm); 

Есть ли кто-нибудь есть опыт использования этой функции? Некоторым кратким примером может быть очень полезно.

Спасибо!

+1

Взгляните на [Boost.Date_Time] (http://www.boost.org/doc/libs/1_43_0/doc/html/date_time/examples.html#date_time.examples.dates_as_strings). Из всего лишь беглого взгляда я не вижу, как заставить работать формат США. –

+1

Используйте для этого простое регулярное выражение. – anno

+0

Я бы предложил объект std :: istringstream в пользу sscanf(), если вы сделали это именно так. strptime() не входит в стандарт ISO /, поэтому не поддерживается повсеместно. – Clifford

ответ

1

Только в случае, если вы хотите, чтобы понять, как он работает (нет BlackBox) или если вы нужен материал, чтобы летать (функция не требует), то вот несколько советов для вас:

//   
char date[] = "30-05-2001"; // DD-MM-YYYY 
int day, month, year; 

day = (date[0] - '0') * 10 + (date[1] - '0'); 
month = (date[3] - '0') * 10 + (date[4] - '0'); 
year = (date[6] - '0') * 1000 + (date[7] - '0') * 100 + (date[8] - '0') * 10 + (date[9] - '0'); 

Это (непроверенный) код для ОДЕЖДЫ правильного способа сделать WHA t you хотел сделать то, что вам нужно сделать (не больше, а не ). Безопасный, маленький, простой, FAST.

Если вы не уверены в дате (пользовательский ввод), то вам нужно будет проверить его действительность (или принять идею жить с недопустимыми датами в вашем приложении).

1

Source:

#include <time.h> 
... 


struct tm tm; 
time_t t; 


if (strptime("6 Dec 2001 12:33:45", "%d %b %Y %H:%M:%S", &tm) == NULL) 
    /* Handle error */; 


printf("year: %d; month: %d; day: %d;\n", 
     tm.tm_year, tm.tm_mon, tm.tm_mday); 
printf("hour: %d; minute: %d; second: %d\n", 
     tm.tm_hour, tm.tm_min, tm.tm_sec); 
printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday); 


tm.tm_isdst = -1;  /* Not set by strptime(); tells mktime() 
          to determine whether daylight saving time 
          is in effect */ 
t = mktime(&tm); 
if (t == -1) 
    /* Handle error */; 
printf("seconds since the Epoch: %ld\n", (long) t);" 
+0

'strptime()' не является частью C++. –

+0

@Georg: Вы правы; но это может помочь для эквивалентных окон http: // stackoverflow.com/questions/321849/strptime-equivalent-on-windows/321877 # 321877 –

+0

@Georg: Вы скорее имели в виду «не часть стандартной библиотеки ISO C++», которая была бы более точной. Это не входит в стандартную библиотеку ISO C. Это справедливая точка зрения с точки зрения переносимости, но, поскольку это было предложение ОП, должно было быть сделано против его должности, возможно? Однако, если целевая библиотека предоставляет его, его можно использовать. Было бы чрезмерно ограничительным предположить, что ни один код не должен использовать сторонние библиотеки или стандартные расширения библиотек. По этой логике OS API тоже будет за пределами! – Clifford

1

См here для примера. Кроме того, хорошее объяснение, как использовать спецификаторы преобразования и т.д.

Edit: Kman был быстрее :)

Edit2: Ссылка ведет к

из причин транспортировки
char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm); 

, а также краткий пример о том, как использовать , Сайт обеспечивается

Открытая группа базовых спецификаций Выпуск 6 IEEE Std 1003.1, 2004 Edition,

+0

Пожалуйста, предоставьте хотя бы краткую информацию, а не только ссылку. –

3
std::istringstream buffer("30-05-2001"); 
int day = 0; 
int month = 0; 
int year = 0; 
char dummy = 0; 

buffer >> day >> dummy >> month >> dummy >> year; 
// TODO: validate values here 

Вы можете выполнять разные читает на данные, если вы хотите также проверить, что манекен равен '-'.

Смежные вопросы