close
Пространства имён
Варианты
Действия

asctime, asctime_s

Материал из cppreference.com
< c | chrono
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
Определено в заголовочном файле <time.h>
(1)
char* asctime( const struct tm* time_ptr );
(до C23)
[[deprecated]] char* asctime( const struct tm* time_ptr );
(начиная с C23)
errno_t asctime_s( char* buf, rsize_t bufsz, const struct tm* time_ptr );
(2) (начиная с C11)
1) Преобразует заданное календарное время tm в текстовое представление следующего фиксированного 25-символьного вида: Www Mmm dd hh:mm:ss yyyy\n
  • Www - трёхбуквенное сокращение английского названия дня из time_ptr->tm_wday, одно из Mon, Tue, Wed, Thu, Fri, Sat, Sun.
  • Mmm - трёхбуквенное сокращение английского названия месяца из time_ptr->tm_mon, одно из Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec.
  • dd - две цифры дня месяца из timeptr->tm_mday, как если бы выводилось sprintf, используя %2d
  • hh - две цифры часа из timeptr->tm_hour, как если бы выводилось sprintf, используя %.2d
  • mm - две цифры часа минуты из timeptr->tm_min, как если бы выводилось sprintf, используя %.2d
  • ss - две цифры часа секунды из timeptr->tm_sec, как если бы выводилось sprintf, используя %.2d
  • yyyy - 4 цифры года из timeptr->tm_year + 1900, как если бы выводилось sprintf, используя %4d
Поведение не определено, если любой член *time_ptr вне своего нормального диапазона
Поведение не определено, если календарный год, указанный в time_ptr->tm_year имеет больше 4 цифр или если он меньше 1000.
Функция не поддерживает локализацию, и символ перехода на новую строку не может быть удалён.
Функция модифицирует статическую память и не является потокобезопасной.
Эта функция не желательна и не должна использоваться в новом коде.
(начиная с C23)
2) То же, что и (1), за исключением того, что сообщение записывается в предоставленный пользователем буфер buf, при этом гарантируется, что он будет нуль-терминирован, и следующие ошибки определяются во время выполнения с вызовом текущей установленной функции set_constraint_handler_s:
  • buf или time_ptr нулевой указатель
  • bufsz меньше 26 или больше RSIZE_MAX
  • не все члены *time_ptr в своих нормальных диапазонах
  • год, указанный в time_ptr->tm_year меньше 0 или больше 9999
Как и для всех функций с проверкой выхода за границы, наличие asctime_s гарантируются только если реализацией определён __STDC_LIB_EXT1__ и если пользователь определяет __STDC_WANT_LIB_EXT1__ целой константой 1 перед включением <time.h>.

Параметры

time_ptr указатель на объект типа tm, обозначающий время для вывода
buf указатель на предоставленный пользователем буфер длиной как минимум 26 байт
bufsz размер предоставленного пользователем буфера

Возвращаемое значение

1) указатель на статическую нуль-терминированную строку, содержащую текстовое представление даты и времени, как описано выше. Строка может быть в совместном доступе у asctime и ctime, и может быть перезаписана при каждом вызове любой из этих функций.
2) ноль при успехе, ненулевое значение при ошибке, при этом buf[0] устанавливается в ноль (за исключением случая, когда buf нулевой указатель или bufsz ноль или больше RSIZE_MAX).

Замечания

asctime возвращает указатель на статические данные и не потокобезопасна. POSIX помечает эту функцию устаревшей и рекомендует взамен strftime. Стандарт C также рекомендует strftime вместо asctime и asctime_s, поскольку strftime более гибкая и учитывает локаль.

POSIX ограничивает неопределённое поведение только на случай, когда выходная строка может быть больше 25 символов, когда timeptr->tm_wday или timeptr->tm_mon вне своих ожидаемых границ или когда timeptr->tm_year превышает INT_MAX-1990.

Некоторые реализации обрабатывают timeptr->tm_mday==0 как последний день предыдущего месяца.

Пример

#define __STDC_WANT_LIB_EXT1__ 1
#include <time.h>
#include <stdio.h>

int main(void)
{
    struct tm tm = *localtime(&(time_t){time(NULL)});
    printf("%s", asctime(&tm));

#ifdef __STDC_LIB_EXT1__
    char str[26];
    asctime_s(str, sizeof str, &tm);
    printf("%s", str);
#endif
}

Возможный вывод:

Tue May 26 21:51:50 2015
Tue May 26 21:51:50 2015

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.27.2.1 Функция asctime (стр. 287)
  • K.3.8.2.1 Функция asctime_s (стр. 453-454)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.27.2.1 Функция asctime (стр. 392-393)
  • K.3.8.2.1 Функция asctime_s (стр. 624-625)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.23.3.1 Функция asctime (стр. 341-342)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.12.3.1 Функция asctime

См. также

(устарело в C23)(C11)
преобразует объект time_t в текстовое представление
(функция) [править]
преобразует объект tm в настраиваемое текстовое представление
(функция) [править]