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
тип.
В общем,
- вызов
time()
чтобы получить текущее время вtime_t
переменная - вызов
localtime()
чтобы получить указатель наstruct tm
структура с информацией о времени в отдельных полях - вызов
strftime()
чтобы получить желаемый формат времени / даты.
Предложите прочитать справочные страницы для localtime()
и для strftime()
чтобы получить все детали
Вот пример кода, где вам нужно изменить строку формата strftime() для того, что вы хотите иметь в результирующем массиве char.
time_t currentTimeSec = time(NULL);
struct tm *tmStructptr;
char timeStamp[128];
tmStructptr = localtime( ¤tTimeSec );
strftime( timeStamp, sizeof(timeStamp), "YOUR FORMAT STRING" tmStructptr );
Примечание: чтобы извлечь только день недели, строка формата будет выглядеть так: "%w"