asctime, asctime_s
Материал из cppreference.com
<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, используя%2dhh- две цифры часа изtimeptr->tm_hour, как если бы выводилось sprintf, используя%.2dmm- две цифры часа минуты изtimeptr->tm_min, как если бы выводилось sprintf, используя%.2dss- две цифры часа секунды изtimeptr->tm_sec, как если бы выводилось sprintf, используя%.2dyyyy- 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 в настраиваемое текстовое представление (функция) | |
Документация C++ по asctime
| |