Функции работы с датой и временем

Язык Си / Функции работы с датой и временем

Для работы с системной датой и временем используется библиотека time.h.

Типы, определенные в библиотеке time.h

Тип Описание
size_t Целочисленный тип, возвращаемый операцией sizeof.
clock_t Арифметический тип, подходящий для представления времени.
time_t Арифметический тип, подходящий для представления времени.
struct tm Структурный тип, содержащий компоненты календарного времени.

Для определения текущего календарного времени используется функция

time_t time(NULL);

Данная функция возвращает время в секундах начиная с 1 января 1970 г.

Например,
Дата и время
Структура tm имеет вид

struct tm
{
  int tm_sec;     // секунды после минут [0,59]
  int tm_min;     // минуты после часов [0,59]
  int tm_hour;    // часы после полуночи [0,23]
  int tm_mday;    // день месяца [1,31]
  int tm_mon;     // месяц года (январь = 0) [0,11]
  int tm_year;    // год (1900 год = 0)
  int tm_wday;    // день недели (вс = 0) [0,6]
  int tm_yday;    // день года (1 января = 0) [0,365]
  int tm_isdst;   // флаг перехода на летнее время (>0- вкл.)
};

Функция

struct tm *localtime(const time_t *ptm) ;

преобразует календарное время, указанное ptm, сохраняет его в структуре tm и возвращает указатель на нее.

Функция

clock_t clock (void);

возвращает наилучшее приближение процессорного времени, прошедшего с момента запуска программы; для получения времени в секундах значение необходимо разделить на константу, определенную в библиотеке time.h

#define CLOCKS_PER_SEC 1000

Если время не доступно или не может быть представлено, возвращает (clock_t) (-1).

Функция

size_t strftime(
char *restrict s, // указатель на выходную строку
size_t max,    // максимальный размер выходной строки
const char *restrict fmt, // указатель на строку формата
const struct tm *restrict tmpt); // указатель на структуру tm

копирует строку fmt в строку s, заменяя спецификаторы формата в fmt соответствующими данными, взятыми из содержимого структуры времени, на которое указывает tmpt; в строку s помещается не более max символов.

Функция возвращает количество символов (исключая нулевой) в результирующей строке. Если результирующая строка (включая нулевой символ) содержит больше, чем max символов, функция возвращает 0, а содержимое s не определено.

Спец. Назначение
%a Локальное сокращенное название дня недели
%A Локальное полное название дня недели
%b Локальное сокращенное название месяца
%B Локальное полное название месяца
%c Локальный разделитель даты и времени
%d День месяца в виде десятичного числа (01-31)
%D Эквивалент %m/%d%y
%e День месяца (десятичное число): однозначные числа дополнены пробелом
%F Эквивалент %Y-%m-%d
%g Последние два разряда года (00-99)
%G Год в виде десятичного числа
%H Часы (по 24-часовой шкале) в виде десятичного числа (00-23)
%I Часы (по 12-часовой шкале) в виде десятичного числа (01-12)
%j День года в виде десятичного числа (001-366)
%m Месяц в виде десятичного числа (01-12)
%n Символ новой строки
%M Минуты в виде десятичного числа (00-59)
%p Локальный эквивалент a.m./p.m. для 12-часовой временной шкалы
%r Локальное 12-часовое время
%R Эквивалент %Н:%М
%S Секунды в виде десятичного числа (00-61)
%t Символ горизонтальной табуляции
%T Эквивалент %H:%M:%S
%u Номер дня недели (1-7), где 1 соответствует понедельнику
%U Номер недели в году, считая воскресенье первым днем недели (00-53)
%w Номер дня недели в виде десятичного числа, начиная с воскресенья (0-6)
%W Номер недели в году, считая понедельник первым днем недели (00-53)
%y Год без века в виде десятичного числа (00-99)
%Y Год с веком в виде десятичного числа
%z Смещение от UTC (“-800″ означает на 8 ч по Гринвичу западнее).
%Z Наименование часового пояса (если доступно)
%% % (то есть знак процента).
Функция, позволяющая вывести день недели на русском языке
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
char * settime(struct tm *u)
{
  char s[40];
  char *tmp;
  for(int i=0;i<40;i++) s[i]=0;
  int length = strftime(s, 40, "%d.%m.%Y %H:%M:%S ", u);
  switch(u->tm_wday)
  {
    case 0: strcpy(s+length, " воскресенье"); break;
    case 1: strcpy(s+length, " понедельник"); break;
    case 2: strcpy(s+length, " вторник");     break;
    case 3: strcpy(s+length, " среда");       break;
    case 4: strcpy(s+length, " четверг");     break;
    case 5: strcpy(s+length, " пятница");     break;
    case 6: strcpy(s+length, " суббота");     break;
  }
  tmp = (char*)malloc(sizeof(s));
  strcpy(tmp, s);
  return(tmp);
}
int main() {
  struct tm *u;
  char *f;
  system("chcp 1251");
  system("cls");
  const time_t timer = time(NULL);
  u = localtime(&timer);
  f = settime(u);
  printf("%ld соответствует ", timer);
  puts(f);
  getchar();
  return 0;
}

Результат выполнения
Дата и время

Реализация функции задержки
#include <stdio.h>
#include <time.h>
void delay(int ms) // аргумент- требуемое время задержки в миллисекундах
{
  int c = clock() + ms;
  while(clock() < c);
}
int main() {
  printf("clock = %d\n", clock());
  delay(1000);
  printf("clock = %d\n", clock());
  getchar();
  return 0;
}

Результат выполнения
Функция задержки

Назад


Назад: Язык Си

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *