Как мне сохранить временную метку time_t в файл, используя C? - PullRequest
6 голосов
/ 06 ноября 2010

Для небольшой программы todo, которую я пишу, у меня есть метки времени этой формы

time_t t = time(NULL);

и сохраняются каждый раз при вводе задачи для обозначения времени, когда она была введена.

Я хочу сохранить задачи в виде простого текстового файла, чтобы состояние можно было сохранить и восстановить. Как сохранить метки времени в текстовом файле и как вернуть их обратно в программу после прочтения текстового файла?

Ответы [ 3 ]

12 голосов
/ 06 ноября 2010

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

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

Для справки:

Пример кода:

// Converting from time_t to string
time_t t = time(NULL);
struct tm *ptm = gmtime(&t);
char buf[256];
strftime(buf, sizeof buf, "%F %T", ptm);
// buf is now "2015-05-15 22:55:13"

// Converting from string to time_t
char *buf = "2015-05-15 22:55:13";
struct tm tm;
strptime(buf, "%F %T", &tm);
time_t t = mktime(&tm);
3 голосов
/ 06 ноября 2010

Способ portable использует функцию difftime.Вычислите time_t для выбранной эпохи, используя mktime, затем используйте difftime, чтобы вычислить разницу в секундах.Чтобы преобразовать обратно, вы можете начать с эпохи как struct tm и добавить количество секунд к tm_sec, а затем позвонить mktime, чтобы получить time_t.

вменяемый Можно предположить, что time_t представлено в секундах с начала эпохи Unix (1970-01-01 00:00 по Гринвичу) и преобразовать его в большой целочисленный тип (лучше всего long long), чтобы напечатать его.POSIX требует, чтобы time_t были секундами с начала эпохи, и в любой здравомыслящей системе это будет.

1 голос
/ 06 ноября 2010

Если вы не возражаете против непереносимых предположений, просто приведите time_t к long (long long, если у вас есть компилятор C99), запишите значение long, прочитайте значение и приведите обратно кtime_t.

Стандарт не гарантирует, что time_t даже может быть представлен в виде long: он только говорит, что time_t - это арифметический тип, но вышеприведенный прием должен работать для всех вменяемых систем: -) * +1010 *

...