Лекция № 12

Тема: "Работа с данными типа Дата/Время"

 

План

1. Понятие и назначение типа TDateTime. Генерирование Даты / Времени.

2. Выделение частей из   Даты / Времени

3. Функции преобразования Даты / Времени в текст

4. Функции расчета Даты / Времени. сравнение Даты / Времени

5. Компоненты для работы с датами

 

1. Понятие и назначение типа TDateTime. Генерирование Даты / Времени.

Для хранения даты, времени или обоих значений сразу в Delphi имеется тип TDateTime. Переменная такого типа сохраняется как переменная Double с датой в целой части, а временем в дробной. Дата сохраняется как число дней с 30 декабря 1899  

Поскольку   TDateTime   фактически является значением типаDouble, то вы можете выполнять над ним вычисления, как над обычным числом, используя операции "+" или "-". При этом, если переменную типа TdateTime изменить на целое число, то фактически дата изменяется на указанное количество дней.

Для пользователя записывать дату или время в виде цифр неудобно, поэтому существует несколько способов генерирования значений Даты / Времени для следующей обработки. Рассмотрим их:

 

- Day - генерирует текущую дату (дата берется с системных часов компьютера пользователя)

- Time - генерирует текущее время (время берется с системных часов компьютера пользователя)

- Now - генерирует текущую дату и время.

 

Пример:

 

var d, t, dt: TDateTime;

begin

    d:=Date; // сегодняшнее число

    t:=Time; // текущее время

    dt:=Now; // текущая дата и время

 

Продемонстрируем возможности вычисления дат:

 

d:=Date-1; // вчерашняя дата

d:=Date + 1; // завтрашняя дата

 

Если нужно записать произвольную дату, то ее привычнее задавать в текстовом формате, а затем конвертировать в тип TDateTime. Для этого используются функции:

 

- StrToDate(текст) - конвертирует дату в тип TDateTime

- StrToTime(текст) - конвертирует время в тип TDateTime

- StrToDateTime(текст) - конвертирует дату и время в тип TDateTime

 

Пример:

 

var d, t, dt: TDateTime;

begin

    d:=StrToDate('15.01.2014 '); // записали в переменную дату

    t:=StrToTime('12:45 '); // записали в переменную время

    dt:=StrToDateTime('15.01.2014 12:45'); // записали в переменную дату и время

 

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

 

- EncodeDate (год, месяц, день) - генерирует дату

- EncodeTime (часы, минуты, секунды, миллисекунды) - генерирует время

- EncodeDateTime (год, месяц, день, часы, минуты, секунды, миллисекунды) - генерирует дату и время

 

Пример:

 

var d, t, dt: TDateTime;

begin

    d:=EncodeDate(2014,1,15) // генерируется дата 15.01.2014

    t:=EncodeTime(12,45,0,0) // генерируется время 12:45:00

    dt:=EncodeDateTime(2014,1,15,12,45,0,0) // генерируется 15.01.2014 12:45:00

 

2. Выделение частей из   Даты / Времени

При работе с типом TDateTime часто возникает необходимость выделить из значения его часть. Для выполнения этого существуют специальные функции, которые описаны в модуле DateUtils. Следовательно перед их использование нужно подключить данный модуль. Рассмотрим эти функции:

 

- DayOf (дата) - выделяет номер дня

- MonthOf (дата) - выделяет номер месяца

- DayOfWeek (дата) - выделяет номер дня недели (нумерация с 1, 1 - воскресенье)

- DayOfTheWeek (дата) - похожа на предыдущую, но нумерация с 0, 0 - воскресенье)

- YearOf (дата) - выделяет год из даты

- HourOf (время) - выделяет часы из времени

- MinuteOf (время) - выделяет минуты из времени

- SecondOf (время) - выделяет секунды из времени

- CurrentYear - текущий год

 

Примеры

 

var d, m, w, y: integer;

h, n, s: integer;

begin

    d:=DayOf(Date) // текущий день

    m:=MonthOf(Date) // текущий месяц

    w:=DayOfWeek(Date) // номер текущего дня недели

    y:=YearOf(Date) // текущий год. Можно записать и так: y := CurrentYear;

    h:=HourOf(Time) // значение часов в текущий момент

    n:=MinuteOf(Time) // значение минут в текущий момент

    s:=SecondOf(Time) // значение секунд в текущий момент

 

Существую процедуры, которые разбивают значение TDateTime сразу на все составляющие и записывают результат в отдельные переменные

 

- DecodeDate(дата, год, месяц, день) // разбирает дату на день, месяц, год

- DecodeTime(время, часы, минуты, секунды, миллисекунды) // разбирает время на составляющие

- DecodeDateTime(дата, год, месяц, день, часы, минуты, секунды, миллисекунды) // разбирает дату/время на составляющие

 

Пример:

 

var y, m, d: integer;

h, n, s, ms: integer;

begin

DecodeDate(Date, y, m, d) // разбирает текущую дату в переменные y, m, d

DecodeTime(Time, h, n, s, ms) // разбирает текущее время в переменные h, n, s, ms

DecodeDateTime(Now, y, m, d, h, m, s, ms) // разбирает дату и время в переменные

 

3. Функции преобразования Даты / Времени в текст

Как было сказано выше, значения Даты / Времени хранится в памяти как вещественное число, что совсем не удобно для восприятия пользователем. Для вывода таких значений на форму необходимо преобразовывать их в удобный текстовый вид. Для этого существует ряд функций:

 

- DateToStr(дата) - преобразовать дату в текст

- TimeToStr(время) - преобразовать время в текст

- DateTimeToStr(дата и время) - преобразовать дату и время в текст

 

Пример

 

var d: TDateTime;

begin

    d:=Now;

    ShowMessage('Сегодня' + DateToStr(d));

    ShowMessage('Текущее время: '+ TimeToStr(d));

    d:=d+10;

    ShowMessage('Через 10 дней будет: '+ DateTimeToStr(d));

 

Форматирование вывода

При конвертировании значений Дата / Время в текст используется формат, принятый в настройках операционной системы конкретного пользователя. Если нужно представит значения в ином формате, то для конвертировании используйте функцию вида:

 

FormatDateTime('format', дата/время)

 

Параметр format может содержать следующие символы:

 

d - день (если использовать сочетание "ddd", то отображается сокращенное название дня недели - "Пн", "Вт" и т.д. Если использовать сочетание "dddd", то отображаетмся полное название дня недели)

m - месяц (если использовать сочетание "mmm", то отображается сокращенное название месяца - "Янв", "Фев" и т.д. Если использовать сочетание "dddd", то отображаетмся полное название месяца)

y - год

h - часы

n - минуты

s - секунды

/ - разделитель дат

: - разделитель времени

" " - символ, заключенный в кавычки воспринимается именно как символ

Остальные символы отображаются как в шаблоне:

 

Пример:

 

var d:TDateTime;

begin

    d:=Now;

    ShowMessage('Дата в обычном формате: '+ FormatDateTime('dd/mm/yyyy',d)); // дд.мм.гггг

    ShowMessage('Дата в формате Access: '+ FormatDateTime('#dd"/"mm"/"yyyy#",d)); // #мм/дд/гггг#

    ShowMessage('Дата в формате MySQL:'+ FormatDateTime('yyyy-mm-dd',d)); //мм-дд-гггг

          ShowMessage('Сегодня: '+ FormatDateTime('dddd dd mmmm yyyy hh:nn:ss',d)); //день недели, в дате название месяца полностью, время

 

4. Функции расчета Даты / Времени. Сравнение Даты / Времени

Для выполнения расчетов можно использовать простые арифметические операции + и -. В этом случае вы можете найти разницу между датами или перейти вперед или назад на указанную дату.

Если к дате прибавить или от даты отнять целое число, то дата изменится на заданное количество дней.

Также можно использовать функции вида: 

 

DaysBetween(дата, дата) - число дней между датами

MonthsBetween(дата, дата) - число месяцев между датами

YearsBetween(дата, дата) - число лет между датами

HoursBetween(дата, дата) - число часов между датами

MinutesBetween(дата, дата) - число минут между датами

SecondsBetween(дата, дата) - число секунд между датами

 

Для изменения даты или времени употребляют функции:

 

IncDay(дата, число) - изменяет дату на число дней

IncMonth(дата, число) - изменяет дату на число месяцев

IncYear(дата, число) - изменяет дату на число лет

IncHour(дата, число) - изменяет дату на число часов

IncMinute(дата, число) - изменяет дату на число минут

IncSecond(дата, число) - изменяет дату на число секунд

 

Пример.

 

var d: TDateTime;

begin

    d:=IncDay(Now, -1) // получили вчерашнюю дату

    d:=IncMonth(Now, 1); // получили этот же день в следующем месяце

    d:=IncHour(Now, 100); // получили дату, которая наступит через 100 часов от текущего момента

 

Для сравнения дата и времени употребляют стандартные операции отношения =, < > , > , > =, < ,< =. Также существует функция сравнения даты и времени:

 

Пример:

 

var a, b: TDateTime;

begin

a:=StrToDate('05.01.2014');

b:=StrToDate('10.01.2014');

 

a > b - false

a < b - true

5. Компоненты для работы с датами

Для работы с датами желательно использовать компоненты, которые защищают пользователя от ошибок ввода. К таким компонентам относятся DateTimePicker (Win32) и MonthCalendar (Win32). Оба компонента имеют идентичные характеристики, но отличаются внешним видом: первый компонент - это поле с раскрывающимся календарем, второй - это календарь на отдельный месяц. Первый экономит место на форме, второй - более наглядный, так как сразу отображает все даты месяца.

Основные свойства компонентов:

 

CalColors - параметры цветов разных частей календаря;

Date - дата, выбранная в календаре;

DateFormat - формат отображения даты (Short - обычный формат, Long - месяц отображается текстом);

MaxDate - максимально допустимая дата

MinDate - минимально допустимая дата.

 

Вопросы для самоконтроля

1. Как описать переменную для работы с датой/временем? Как сгенерировать в пременной текущую дату/время?

2. Как записать в переменную любую дату? Как выделить из даты/времени нужную часть?

3. Как вывести дату в произвольном формате? Приведите символы шаблона.

4. Как посчитать интервал между датами/временами и увеличить дату/время на заданное значение?

5. Какие компоненты существуют для работы с датами? Опишите их свойства.