Лекция № 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. Какие компоненты существуют для работы с датами? Опишите их свойства.