Spec-Zone.ru › C

asctime, asctime_s

Определено в заголовочном файле <time.h>
char*                asctime( const struct tm* time_ptr );
(1) (до 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 — четырёхзначный год из timeptr->tm_year + 1900, как если бы он был напечатан функцией sprintf с использованием %4d.
Поведение не определено, если какое-либо поле *time_ptr находится вне своего допустимого диапазона.
Поведение не определено, если календарный год, указанный в time_ptr->tm_year, содержит более 4 цифр или меньше 1000.
Функция не поддерживает локализацию, а символ новой строки нельзя удалить.
Функция изменяет статическую область памяти и не является потокобезопасной.
Эта функция объявлена устаревшей и не должна использоваться в новом коде. (начиная с C23)
2) То же, что и (1), за исключением того, что сообщение записывается в предоставленную пользователем область памяти buf, для которой гарантируется завершение нулевым символом, а во время выполнения обнаруживаются следующие ошибки, после чего вызывается установленная в данный момент функция обработчика ограничений:
  • 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 <stdio.h>
#include <time.h>

int main(void)
{
    struct tm tm = *localtime(&(time_t){time(NULL)});
    printf("%s", asctime(&tm)); // note implicit trailing '\n'

#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

См. также

ctimectime_s
(устарела в C23)(C11)
преобразует объект time_t в текстовое представление
(функция)
strftime
преобразует объект tm в пользовательское текстовое представление
(функция)
Документация по C++ для asctime

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/chrono/asctime

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API