Для лучшего управления точным форматированием времени и даты ОС Linux и современные UNIX-подобные системы предоставляют функцию strftime
sprintf для дат и времени и действует аналогичным образом:#include
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);
Функция strftime
tm, на которую указывает параметр, timeptr, и помещает результат в строку s. Эта строка задается длиной maxsize (как минимум) символов. Строка format применяется для управления символами, записываемыми в строку. Как и в функции printf, она содержит обычные символы, которые будут переданы в строку, и спецификаторы преобразований для форматирования элементов времени и даты. В табл. 4.3 перечислены используемые спецификаторы преобразований.| Спецификатор преобразования | Описание |
|---|---|
%a | Сокращенное название дня недели |
%А | Полное название дня недели |
%b | Сокращенное название месяца |
%B | Полное название месяца |
%c | Дата и время |
%d | День месяца, 01–31 |
%H | Час, 00–23 |
%I | Час по 12-часовой шкале, 01–12 |
%j | День в году, 001–366 |
%m | Номер месяца в году, 01–12 |
%M | Минуты, 00–59 |
%p | a.m. (до полудня) или p.m. (после полудня) |
%S | Секунды, 00–59 |
%u | Номер дня недели, 1–7 (1 соответствует понедельнику) |
%U | Номер недели в году, 01–53 (воскресенье — первый день недели) |
%V | Номер недели в году, 01–53 (понедельник — первый день недели) |
%w | Номер дня недели, 0–6 (0 соответствует воскресенью) |
%x | Дата в региональном формате |
%X | Время в региональном формате |
%y | Номер года, меньший 1900 |
%Y | Год |
%Z | Название часового пояса |
%% | Символ % |
Таким образом, обычная дата, такая же, как полученная из программы date, соответствует следующей строке формата функции strftime
"%a %b %d %Н: %М: %S %Y"
Для облегчения чтения дат можно использовать функцию strptime
tm с теми же датой и временем:#include
char *strptime(const char *buf, const char *format, struct tm *timeptr);
Строка format
strftime. Функций strptime действует аналогично функции sscanf: она сканирует строку в поиске опознаваемых полей и записывает их в переменные. В данном случае это элементы структуры tm, которая заполняется в соответствии со строкой format. Однако спецификаторы преобразований для strptime немного мягче спецификаторов функции strftime. Так, в функции strptime разрешены как сокращенные, так и полные названия дней и месяцев. Любое из этих представлений будет соответствовать спецификатору %a функции strptime. Кроме того, в то время как функция strftime для представления чисел, меньших 10, всегда применяет ведущие нули, strptime считает их необязательными.Функция strptime
tm записаны значимые данные, вызывающей программе следует проверять, достаточно ли символов строки принято и обработано.Рассмотрим работу функций на примере (упражнение 4.9).
strftimestrptimeОбратите внимание на выбор спецификаторов преобразований, использованных в следующей программе:
#include
#include
#include
int main() {
struct tm *tm_ptr, timestruct;
time_t the_time;
char buf[256];
char *result;
(void)time(&the_time);
tm_ptr = localtime(&the_time);
strftime(buf, 256, "%A %d %B, %I:%S %p", tm_ptr);
printf("strftime gives: %s\n", buf);
strcpy(buf, "Thu 26 July 2007, 17:53 will do fine");
printf("calling strptime with: %s\n", buf);