C ++ конвертировать time_t в строку и обратно - PullRequest
7 голосов
/ 19 августа 2011

Я хочу преобразовать time_t в строку и обратно.
Я бы хотел преобразовать время в строку, используя ctime ().
Кажется, я ничего не могу найти в google или заголовочном файле time.h, есть идеи?
По сути, я пытаюсь сохранить дату в файле, а затем прочитать ее обратно, чтобы я мог снова использовать ее как time_t.
Кроме того, нет ссылок на библиотеки за пределами std, mfc.
Еще одно примечание, это должно работать в Windows XP и выше, и все.

Редактировать

Все, что я хочу сделать, это преобразовать time_t в строку (мне все равно, читается ли он человеком), а затем преобразовать его обратно в time_t.Я просто пытаюсь сохранить time_t в файле и прочитать его снова (но я не хочу никакого кода для этого, поскольку в файле будет больше информации, кроме time_t).

Ответы [ 4 ]

13 голосов
/ 19 августа 2011

Для этого вам нужно написать собственную функцию.Эти функции преобразуют любой тип примитива (или любой тип, который перегружает operator << и / или operator >>) в строку, и наоборот:

template<typename T>
std::string StringUtils::toString(const T &t) {
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

template<typename T>
T StringUtils::fromString( const std::string& s ) {
    std::istringstream stream( s );
    T t;
    stream >> t;
    return t;
}
2 голосов
/ 19 августа 2011

ctime() возвращает указатель на символьный буфер, который использует определенное форматирование.Вы можете использовать sprintf() для разбора такой строки на отдельные части, сохранить их в struct tm и использовать mktime() для преобразования в time_t.

2 голосов
/ 19 августа 2011

Статья time_t в Википедии проливает свет на это.Суть в том, что тип time_t не гарантируется в спецификации C.Вот пример того, что вы можете попробовать:

Попробуйте stringstream.

#include <string>
#include <sstream>

time_t seconds;
time(&seconds);

std::stringstream ss;
ss << seconds;
std::string ts = ss.str();

Хорошей оберткой вокруг вышеупомянутой техники является лексический_каст Boost:

#include <boost/lexical_cast.hpp>
#include <string>

time_t t;
time(&t);

std::string ts = boost::lexical_cast<std::string>(seconds);

Википедия о time_t:

Тип данных time_t - это тип данных в библиотеке ISO C, определенный для хранения значений системного времени.Такие значения возвращаются из стандартной библиотечной функции time().Этот тип является typedef, определенным в стандартном заголовке. ISO C определяет time_t как арифметический тип, но не указывает какой-либо конкретный тип , диапазон, разрешение или кодировку для него.Также не определены значения арифметических операций, применяемых к значениям времени.

Unix и POSIX-совместимые системы реализуют тип time_t в виде signed integer (обычно шириной 32 или 64 бита), который представляетколичество секунд с начала эпохи Unix : полночь UTC от 1 января 1970 года (не считая високосных секунд).Некоторые системы правильно обрабатывают отрицательные значения времени, а другие нет.Системы, использующие 32-битный тип time_t, подвержены проблеме 2038 года .

1 голос
/ 19 августа 2011

Преобразуйте time_t в struct tm, используя gmtime () , затем преобразуйте struct tm в обычный текст (предпочтительно в формате ISO 8601), используя strftime () .Результат будет переносимым, читаемым человеком и машиночитаемым.

Чтобы вернуться к time_t, вы просто анализируете строку обратно в struct tm и используете mktime () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...