C ++ конвертировать строку date (1/4/2000) в дату int (20000104)

Я могу написать функцию для синтаксического анализа даты строки, но мне кажется, что я снова изобретаю колесо здесь. Есть ли более быстрый, возможно, встроенный C ++ способ получить от строковой даты этого формата: 1/4/2000 до более простой в использовании int, такой как 20000104?

1
nl ja de
Недавно был задан вопрос аналогичный вопрос .
добавлено автор Alexey Frunze, источник
20000104 может быть легко сравнить или заказать, но для любой арифметики ...
добавлено автор qPCR4vir, источник

2 ответы

Если вам не нужен ваш встроенный способ C ++ для проверки, «очевидный» синтаксический анализ:

int parseDate(const std::string &input) {
    int month;
    int day;
    int year;
    if (std::sscanf(input.c_str(), "%d/%d/%d", &month, &day, &year) != 3) {
       //handle error
    } else {
       //check values to avoid int overflow if you can be bothered
        return 10000 * year + 100 * month + day;
    }
}

Вы можете использовать потоковые экстракторы вместо sscanf , если вы хотите, чтобы записывала несколько строк кода типа безопасности.

В стандартной библиотеке нет ничего, чтобы сделать 10000 * year + 100 * month + day для вас. Если вы не привязаны к этому точному значению, вы просто хотите, чтобы целое число было в правильном порядке, тогда вы можете посмотреть, есть ли у вашей платформы функция, чтобы рассказать вам о так называемом «юлианском дне».

3
добавлено

Стандартная функция библиотеки strptime() , не знаю, как «чистый», который, как считается, находится на C ++.

Если вы в порядке с strptime() , вот как вы могли бы использовать его для своего случая:

struct tm when;

strptime("1/4/2000", "%m/%d/%y", &tm);//Note: should check return value.
const int sortable = 10000 * tm.tm_year + 100 * tm.tm_month + tm.tm_day;

Конечно, вы можете использовать Boost, если хотите; соответствующий угол выглядит как Posix Time .

2
добавлено
Я не знаком с strptime (), можно ли привести пример, который может обрабатывать мой случай, чтобы я (и другие с похожим вопросом) мог видеть, как это работает?
добавлено автор user788171, источник
эти коды не работают, tm_year не правильно получает год.
добавлено автор user788171, источник
Я думаю, что соответствующая документация Boost date_input_facet . Posix Time предполагает, что вход уже находится в формате ISO, то есть в первом году.
добавлено автор MSalters, источник
strptime имеет захватывающее свойство, которое находится в Posix, но не в стандартном C ++ (или стандартном C). В C ++ есть категория локали, называемая time_get , которая анализирует те же форматы, но я никогда не использовал ее, поэтому я не могу легко привести пример.
добавлено автор Steve Jessop, источник
добавлено автор qPCR4vir, источник
добавлено автор qPCR4vir, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest