Случилась мне необходимость считать из 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 реализована в самых разных языках кроме Си, а это значит, что данный метод работает очень много где....
четверг, 15 ноября 2012 г.
С++ Дата из строки ( c миллисекундами)
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий