C - строковое представление time_t

Я новичок в программировании на C, и мне нужна помощь с простой задачей.

Итак, у меня есть эта функция:

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     char *time_s = "";

     return time_s;
}

Я хотел бы получить в формате ДД / ММ / ГГГГ ЧЧ: ММ время и сохранить его в переменной time_s, чтобы я мог его вернуть. Моя проблема в том, что я не могу понять, как отформатировать строку и сохранить ее БЕЗ печати. Все, что я нашел до сих пор, - это метод sprint, который на самом деле печатает отформатированную строку при ее сохранении, а это не то, что мне нужно.

В нескольких словах, я бы хотел, чтобы время от time_t в указанном формате сохранялось в time_s.

Извините, если я не все правильно объяснил, но я новичок в программировании на Си.

4 ответа

Решение

Тебе нужно sprintf который похож на printf но "печатает" результат в буфер, а не на экран.

Возврат указателя на статический буфер:

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";

     static char time_s[20];                             // ugly, 20 is hopefully enough
  // ^ static is important here, because we return a pointer to time_s
  //   and without static, the time_s buffer will no longer exist once the
  //   time2str function is finished

     sprintf(time_s, str_fmt, time.....);
     return time_s;
}

или (лучше) мы предоставляем буфер (достаточно длинный), в который должна быть помещена преобразованная строка:

void time2str(time_t time, char *time_s) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     sprintf(time_s, str_fmt, time.....);
     return time_s;
}
...
char mytime[20];                                         // ugly, 20 is hopefully enough
time2str(time, mytime);
printf("mytime: %s\n, mytime);

или функция time2str возвращает вновь выделенный буфер, который будет содержать преобразованную строку. Этот буфер должен быть освобожден позже free,

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     char *time_s = malloc(20);                          // ugly, 20 is hopefully enough
     sprintf(time_s, str_fmt, time.....);
     return time_s;
}
...
char *mytime = time2str(time);
printf("mytime: %s\n, mytime);
free(mytime);

Завершение аргументов sprintf оставлено в качестве упражнения для читателя.

Отказ от ответственности: не проверенный, не проверяющий ошибки код, предназначенный только для демонстрационных целей.

Функция ctime занимает time_t и выводит строку в фиксированном формате. Если этого недостаточно для вашей задачи, вы должны использовать strftime, Это имеет целую кучу спецификаторов формата, которые должны соответствовать вашим потребностям.

Работает на struct tm, так что вы должны сначала преобразовать time_t чтобы с помощью localtime или же gmtime,

Ты можешь использовать strftime() после преобразования вашего time_t значение для struct tm тип.

В общем,

  1. вызов time() чтобы получить текущее время в time_t переменная
  2. вызов localtime() чтобы получить указатель на struct tm структура с информацией о времени в отдельных полях
  3. вызов strftime() чтобы получить желаемый формат времени / даты.

Предложите прочитать справочные страницы для localtime() и для strftime() чтобы получить все детали

Вот пример кода, где вам нужно изменить строку формата strftime() для того, что вы хотите иметь в результирующем массиве char.

time_t     currentTimeSec = time(NULL);
struct tm *tmStructptr;
char       timeStamp[128];

tmStructptr = localtime( &currentTimeSec );
strftime( timeStamp, sizeof(timeStamp), "YOUR FORMAT STRING" tmStructptr );

Примечание: чтобы извлечь только день недели, строка формата будет выглядеть так: "%w"

Другие вопросы по тегам