Преобразование поля даты SQLite в C++ Time_T

Как преобразовать дату SQLite в следующем формате в переменную C++ Time_T?

YYYY-MM-DD HH:MM:SS

person Talon06    schedule 05.07.2013    source источник


Ответы (2)


Вы можете прочитать этот вопрос, в котором обсуждаются некоторые подходит. В частности, если у вас есть доступ к Boost, вы можете использовать <boost/date_time/posix_time/posix_time.hpp> и создать объект boost::posix_time::ptime из строки формата вашего вопроса. (См. первый ответ в этом вопросе.)

В качестве альтернативы вы можете использовать strptime().

Пример:

#include <ctime>
#include <iostream>

std::size_t timestamp_to_seconds(const char* timestamp)
{
    std::tm tm_struct;

    strptime(timestamp, "%Y-%m-%d %H:%M:%S", &tm_struct);
    // You can control daylight savings time if necessary.
    tm_struct.tm_isdst = 1;
    std::size_t t = std::mktime(&tm_struct);

    return t;
}

int main()
{
    std::cout << timestamp_to_seconds("2013-07-05 12:34:56") << std::endl;

    return 0;
}

Запуск этого примера дает следующий результат:

$ ./a.out
1373042096
$ date -d "2013-07-05 12:34:56" +%s
1373042096

Как видите, он согласуется с утилитой date. (Я предполагаю, что вы находитесь на платформе с доступом к strptime.) Возможно, вам придется быть осторожным при обработке информации о переходе на летнее время или часовом поясе... Мне пришлось использовать tm_struct.tm_isdst = 1, чтобы принудительно распознать переход на летнее время и договориться с date.

person Community    schedule 05.07.2013
comment
Есть ли лучшая функция типа даты и времени для С++? Я очень новичок в этом языке, и time_t было первым, что я нашел. Я пытался использовать библиотеку boost, но при попытке использовать ее я получаю много ошибок компиляции. Я не знаю, то ли это библиотека, то ли мое непонимание. - person Talon06; 06.07.2013
comment
Привет, Talon06, пожалуйста, посмотрите мое редактирование для краткого примера. Надеюсь, вы сможете изменить его в соответствии с вашими конкретными целями. - person ; 06.07.2013

time_t — это временная метка Unix (в секундах с 1 января 1970 г.), поэтому вам необходимо преобразовать ее с помощью strftime:

SELECT strftime('%s', '2013-07-05 12:34:56');

Результатом является строка, но вы можете прочитать ее как целочисленное значение.

person CL.    schedule 05.07.2013
comment
Есть ли способ сделать это в приложении или мне нужно сделать запрос к этой базе данных? - person Talon06; 05.07.2013
comment
Во-первых, было бы неплохо хранить даты в базе данных в формате time_t. Если вы действительно хотите преобразовать их в свою программу, см. ответ RyanMck. - person CL.; 05.07.2013
comment
Да, было немного непонятно, через C++ или через SQLite должно происходить преобразование. Конечно, преобразование SQLite проще. - person ; 05.07.2013