Форматировать дату в C ++ - PullRequest
1 голос
/ 16 июля 2010

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

string date1 = "30-05-2001";

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

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

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

Спасибо!

Ответы [ 4 ]

3 голосов
/ 16 июля 2010
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

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

1 голос
/ 16 июля 2010

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

Редактировать: KMan был быстрее:)

Редактировать2: ссылка приводит к описанию

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

, а такжеКраткий пример того, как использовать.Сайт предоставлен

Базовые спецификации Open Group Issue 6 IEEE Std 1003.1, издание 2004 г.

1 голос
/ 16 июля 2010

На всякий случай, если вы хотите понять, как это работает (без «черного ящика») или если вам нужно, чтобы материал летал (без вызовов функций), вот несколько советов для вас:

//             0123456789
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');

Это (непроверенный) код ближе к правильному способу делать то, что вы хотели сделать, поскольку он делает только то, что вам нужно (не больше, не меньше).Безопасный, маленький, простой, БЫСТРЫЙ.

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

1 голос
/ 16 июля 2010

Источник :

#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);"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...