Одновременная работа с датой и временем 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Одновременная работа с датой и временем



 

Текущее время можно получить и более замысловатым путем. Довольно обыденным является представление времени в виде нескольких компонент - номера месяца, дня месяца и недели и так далее. Для такого представления существует специальная подробная структура - tm, описанная в том же hеаdеr-файле <time.h>.

Две функции

struct tm *gmtime(long *timeptr);

struct tm *localtime(long *timeptr);

заполняют эту структуру. Первая из них делает это для Гринвичского меридиана, а вторая, как следует из названия, для местного часового пояса.

Функция

long mktime(struct tm *timeptr);

производит обратное действие - преобразует структуру tm в количество секунд после эпохи до момента, записанного в структуре. Одновременно она устанавливает день недели. При неправильной дате или времени возвращает -1. Для некоторых неправильных дат mktime пытается подправить эту дату в самой структуре tm и не возвращает признак ошибки -1.

Функция

char *asctime(struct tm *timeptr);

преобразует структуру tm в строку, эквивалентную возвращаемой функцией ctime().

 

Представление текущего времени в строку

 

Удобному представлению времени служит еще одна функция _strtime()

char *_strtime(char *time);

Функция _strtime() копирует текущее время в буфер, на который указывает аргумент tiтe, по формату "hh:mm:ss", где hh - две цифры, представляющие час в 24-часовой записи, mm - две цифры, представляющие минуты, а ss - две цифры, соответствующие секундам. Буфер должен быть выделен заранее и его длина должна составлять, по крайней мере, девять байт.

 

Работа с тиками

 

Функция clock() сообщает вызывающей программе процессорное время, затраченное с момента начала исполнения этой программы.

clock_t clock(void);

Функция может быть использована для определения временного интервала между двумя событиями. Для перевода количества тиков в секунды необходимо воспользоваться делителем CLK_TCK.

 

Изменение даты и времени модификации файла

 

Функция utime() изменяет дату и время модификации файла.

int utime(char *pathname, struct utimebuf *timeptr);

Структура utimbuf объявлена в файле <sys\utime.h>

struct utimbuf {

    time_t actime; /*время доступа к файлу*/

    time_t modtime; /*время последней модификации файла*/

};

Поскольку файловая система DOS поддерживает только время модификации файла, функция utime поле actime игнорирует.

Если вместо адреса этой структуры функции utiтe() передается NULL, в качестве времени модификации используется текущее системное время. Файл должен иметь разрешение на запись. Код возврата: О при успешном изменении времени модификации файла и -1 при ошибке, определяемой с помощью переменной errno:

EACCES Pathname is directory ог read-only file

EMFILE Тоо many ореn files.

ENOENT File or path name not found

 

Работа с системными часами

 

Вернемся опять к системным часам. Мы не будем вдаваться в подробное рассмотрение устройства таймера, отметим, что он вырабатывает системное прерывание INT 8Н, которое называется "тиком". Тик производится примерно 18,2 раза в секунду, то есть примерно каждые 55 миллисекунд (частота осциллятора системных часов - 1,19318 МГц, деленная на 65536). Пользуясь этим, мы можем производить необходимые машинно-независимые задержки времени, например для генерации звуков. Количество тиков (происшедших с последней полуночи) с помощью прерывания INT 1АН даст нам функция _bios_tiтeofday(). С ее помощью можно также установить новое число тиков. Если с момента последнего чтения или установления тиков миновала полночь, _bios_tiтeofday() возвращает 1, в противном случае - 0. При переходе через полночь необходимо прибавить к имеющимся тикам их количество в полных сутках - 1573040 (или 0x01800B0L).

unsigned _bios_timeofday(unsigntd service, long *timeval);

Переменная timeval указывает на количество тиков. Параметр service равен 0 при получении счетчика тиков и 1 при установлении нового количества тиков.

Текст _blos_tiтeofday() выглядит, вероятно, таким образом:

unsigned _bios_timeofday(unsigntd service, long *timeval)

{

    union REGS inregs, outregs;

    inregs.h.ah = service;

    if(service)

    {

              inregs.x.cx = *timeval >> 0x10; /*старший байт*/

              inregs.x.dx = *timeval;      /*младший байт*/

}

int86(0x1A, &inregs, &outregs);

if(!service)

    *timeval = outregs.x.dx + (outregs.x.cx << 0x10);

return outregs.h.al;

}

Отметим, что для перевода тиков в секунды необходим множитель 1l93180L/65536, обратный частоте генерации тиков. Итого в минуте 1092 тиков, а в часе - 65 543.



Поделиться:


Последнее изменение этой страницы: 2020-03-14; просмотров: 114; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.187.19 (0.007 с.)