Как конвертнуть Строку в Дату и Время

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 15 окт 2014.

  1. AlexVS

    AlexVS Гик

    Есть строка: "2014-10-14 00:18:33", как ее перевести в дату и время и добавить ?
    Есть функция sscanf(), но не понял как ее использовать в этом случае и есть ли она в Arduino IDE.
     
  2. NR55RU

    NR55RU Гик

    В целом, не сомневаюсь что в С++ имеются библиотеки которые предоставляют удобные классы для работы со временем, но я покажу вам возможный пример работы со временем используя лишь возможности стандартной библиотеки, это просто, но кода хватает :)

    Данные код берет вашу строку, извлекает из нее значения, формирует структуру времени, преобразует её unix timestamp (количество секунд с 1 января 1970 года), добавляет 60 секунд, после чего снова преобразует её в структуру времени и потом таким же методом вывод на экран.

    Код не для ардуина а для ПК (нет у меня под рукой ардуина и IDE).
    Код является общим для просто примера, так что не претендует на идеальность, но думаю для примера должен подойти :)

    Код (Text):
    #include <iostream>
    #include <ctime>

    int main()
    {
       char str[] = "2014-10-14 00:18:33";
       int year, month, day, hour, minute, second;

       // Персим строку
       sscanf ( str,"%i-%i-%i %i:%i:%i", &year, &month, &day, &hour, &minute, &second );
       printf( "Year:%d Month:%d, Day:%d, Hours:%d, Minutes:%d, Seconds:%d\n", year, month, day, hour, minute, second );

       // Запишем данные в стурктуру времени
       struct tm time;
       time.tm_year = ( year - 1900 );
       time.tm_mon = ( month - 1 );
       time.tm_mday = day;
       time.tm_hour = hour;
       time.tm_min = minute;
       time.tm_sec = second;

       // Превратим структуру в Unix timestamp
       time_t timeStamp = mktime( &time );
       // Добавим 60 секунду
       timeStamp = timeStamp + 60;

       // Превратим Unix Timestamp в структуру времени (точнее в указатель на неё)
       struct tm *newTime;
       newTime = localtime ( &timeStamp );

       // Выводим новое время
       printf( "Year:%d Month:%d, Day:%d, Hours:%d, Minutes:%d, Seconds:%d\n", newTime->tm_year + 1900, newTime->tm_mon + 1, newTime->tm_mday, newTime->tm_hour, newTime->tm_min, newTime->tm_sec );
       system( "pause" );
    }
     
    Вот тут есть описание функций стандартной библиотеки работы со временем.
    Может показаться геморным, но на самом деле все супер просто, при желании можно самому легко создать класс для удобной работы со временем, либо найти готовый в инете если не хочется мучатся с этими структурами :)

    А что касательно sscanf() тут все просто. Вы показывайте функции как будет выглядеть ваша строка, те символы которые там будут постоянно указываете как есть а на тех местах где будут какие то значения указываете их типы (в данном случае %i означает что на этом месте будет int), ну а функция пытается вашу строку согласно шаблону разобрать и поместить эти значения в набор переданных ей переменных :)
    В сущности это как prinf() только наоборот :)
     
    Megakoteyka, ИгорьК и AlexVS нравится это.
  3. AlexVS

    AlexVS Гик

    Спасибо, попробую.