четверг, 15 ноября 2012 г.

С++ Дата из строки ( c миллисекундами)

Случилась мне необходимость считать из FITS файла время и дату снимка. В этом посту я расскажу, как считать атрибуты с FITS файла и простой способ перевести время и дату из строки в реальные дату и время. Кому интересно, прошу пожаловать под кат...
1 часть - чтения атрибутов FITS файла
Начнём с более простого - вспомним и прошлого моего поста,как мы читали fits файл:

 pFits.reset(new FITS(path,Read,true));
    image = &pFits->pHDU();// get main image from file
    image->readAllKeys();//read Keys
    image->read(contents); // read DATA to valarray
Я ведь не просто так выполнял тогда readAllKeys. Этот метод считывает все дополнительные параметры файла FITS. У PHDU есть ещё один интересный метод - keyWord(). Он возвращает ассоциативный массив(map), ключом которого является строка(название атрибута), а значением - ссылка на специальный тим Keyword (значение атрибута).То есть, этот метод возвращает map<string,*Keyword>. Как работать с map я не буду рассказывать, а из Keyword можно считать в строку с помощью его метода value(). В моем файле дата записана под ключом DATE, а время - TIME-OBS. Вот и считаем сначала в ассоциативный массив, а потом из ассоциативного массива получим дату и время по ключу.
    Keyword* Date = keys.at("DATE");
    Keyword* Time = keys.at("TIME-OBS");

    std::string Dateval;
    std::string Timeval;

    Date->value(Dateval);
    Time->value(Timeval);
Теперь у нас есть 2 строки - дата и время.
2 часть - Перевод из строки в дату
Киким классом даты и времени вам удобно пользоваться? QDateTime? tm? time_t? - Не важно.Любой из ваших любимых типов вы можете создать, если у вас в интовых значениях есть кол-во годов, месяцев, дней, часов, минут, секунд, миллисекунд ... В начале, мне приглянулся тип tm, но в нем нет миллисекунд, поэтому, я создал свой struct для времени. Вот такой:
struct my_tm
{
    int tm_msec;
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
};
А читаем мы в него с помошью замечательной функции sscanf вот таким образом:
 my_tm tm1;
 sscanf(Dateval.c_str(),"%4d-%2d-%2d",&tm1.tm_year,&tm1.tm_mon,&tm1.tm_mday);
 sscanf(Timeval.c_str(),"%2d:%2d:%2d.%3d",&tm1.tm_hour,&tm1.tm_min,&tm1.tm_sec,&tm1.tm_msec);
Вот теперь, мы можем создать любой, необходимый нам класс времени и даты:
    QDate qdate(tm1.tm_year,tm1.tm_mon,tm1.tm_mday);
    QTime qtime(tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
    QDateTime qdatetime(qdate,qtime);
А самое вкусное - то, что функция sscanf реализована в самых разных языках кроме Си, а это значит, что данный метод работает очень много где....

Комментариев нет:

Отправить комментарий