2016-11-25 5 views
0

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

Так что я эту функцию:

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

    return time_s; 
} 

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

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

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

ответ

0

Вам нужен 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 оставлено в качестве упражнения для чтения.

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

+1

Вообще говоря, всегда использовать, по крайней мере, 'snprintf'. * * Легко создавать переполнение буфера с помощью простого 'sprintf'! – hyde

0

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

1

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

Он работает на struct tm, поэтому вы должны сначала конвертировать ваши time_t в том, что с помощью localtime или gmtime.

0

в общем,

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

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

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

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

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

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