Лекція 7

 

Функції дати та часу в Delphi

 

         Для зручності в Delphi є певний набор функції для обробітку дат. Для цього використовуються два модуля SysUtils та DateUtils. SysUtins підключається автоматично, а DateUtils потрібно самостійно додати в розділ оголошення допоміжних модулів. (В розділі Uses потрібно прописати DateUtils)

 

Функція Date: TDateTime;

Опис: Функція повертає поточну дату у форматі TDateTime.

Приклад

var

    S: string;

begin

    S: = DateToStr (Date);

    MessageDlg ('Поточна дата:' + S, mtInformation,[mbOk], 0);

end;

 

Функція DateTimeToStr (DateTime: TDateTime):string;

Опис: Функція перетворює значення дати і часу типу TDateTime в його рядкове представлення. Якщо параметр DateTime не містить значення дати,то дата відображається як 00/00/00. Якщо параметр DateTime не міститьзначення часу, то час відображається як 00:00:00 AM.

Приклад
var
S: string;
begin
S: = DateTimeToStr (Date);
MessageDlg (S, mtInformation, [mbOk], 0);
end;

 

Процедура DateTimeToString (var NewString:string; const Format: string; DateTime: TDateTime);
Опис: Процедура перетворює значення дати і часу форматаTDateTime в його строковий вид, використовуючи заданий формат.Вхідне значення визначається параметром DateTime. Результат повертається у змінній NewString. Форматування рядка здійснюється у відповідності рядком формату Format.

Приклад
var
    S: string;
begin
    DateTimeToString (S, 'Сьогодні dddd dd mmm yyyy р.', Date);
    MessageDlg (S, mtInformation, [mbOk], 0);
end;

 

Функція DateToStr (Date: TDateTime): string;

Опис: Функція перетворює значення дати, тип TDateTime в його строковий вид. Формат дати визначається з глобальної змінної ShortDateFormat.

Приклад
Див приклад функції Date.

 

Функція TimeToStr (Time: TDateTime): string;
Опис

Функція перетворює значення часу,представлене в формате TDateTime, у рядок. Форматування рядка здійснюється у відповідності зі значенням глобальної змінної LongTimeFormat.

Приклад
begin
    MessageDlg ('Поточний час:' + TimeToStr(Time), mtInformation, [mbOk], 0);
end;

Функція Time: TDateTime;

Опис
Функція повертає поточне значення часу у форматі TDateTime.
Приклад
begin
    MessageDlg ('Поточний час:' + TimeToStr(Time), mtInformation, [mbOk], 0);
end;

 

Функція StrToTime (const S: string): TDateTime;

Опис
Функція перетворює строкове подання значення часу в значення типу TDateTime. Рядок повинен складатися з двох (години: хвилини) чи трьох(години: хвилини: секунди) чисел, відокремлених один від одного символом-роздільником.Символ, що використовується в якостіроздільника, визначається значенням глобальної змінної TimeSeparator. Для використання 12-ти годинного формату часу задана стрічка повинназакінчуватися значенням 'AM' або 'PM'. Якщовказані значення відсутні, то буде застосовано24-х годинний формат. Якщо рядок містить неприпустиме значення часу, то виникає виняток EConvertError.

Приклад
Див приклад процедури ReplaceTime.

 

Функція StrToDateTime (const S: string):TDateTime;
Опис

Функція перетворює строкове подання дати йчасу в значення типу TDateTime. Вхідна S повинна мати формат MM / DD / YY HH: MM:SS (ММ / ДД / РР ГГ: ММ: СС). Порядок дня, місяця і року в рядку визначається значенням глобальної змінної ShortDateFormat. Значення секунд може бути опущено. Якщо у вхідному рядку після значеннячасу стоїть 'AM' або 'PM', то перетворення відбувається з використанням 12-ти годинного формату часу, інакше використовується 24-х годинний формат. Докладну інформацію про формат дати див. в описі функції StrToDate. Якщо рядок S містить неприпустиме значення,то виникає виняток EConvertError.

Приклад
Перегляньте приклади процедур ReplaceDate,ReplaceTime

 

Функція StrToDate (const S: string): TDateTime;
Опис

Функція перетворює строкове значення дати в значення типу TDateTime. Вхідна рядок повинен складатися з двох або трьох чисел, відокремлених символами-роздільниками.Символ, що використовується в якості роздільника, визначається значенням глобальної змінної DateSeparator. Порядок дня місяця і року визначається глобальною змінною ShortDateFormat. Можливі наступні комбінації: місяць / день / рік, день / місяць / рік і рік / місяць / день. Якщо рядок містить лише два числа, то вони сприймаються, як день і місяць (місяць / день або день / місяць) поточного року. Якщо в значенні року використовує тільки два символи, то століття (XX або XXI), до якого буде віднесений даний рік, буде визначатися значенням глобальної змінної TwoDigitYearCenturyWindow. Якщо значення даної змінної дорівнює 0, то всі значення року (0 .. 99) будуть віднесені до XX ст. Якщо значення TwoDigitYearCenturyWindow> 0, то обчислюється "базовий" рік ("базовий рік": = "поточний рік"-TwoDigitYearCenturyWindow), і всі роки, починаючи з "базового" будуть ставитися до XX століття, а всі роки менше "базового", до XXI століття. Якщо рядок містить неприпустиме значення дати, то виникає виняток EConvertError. Змінюючи значення змінної TwoDigitYearCenturyWindow. можна збільшити термін працездатності додатків, в яких для значення року можливо використовувати тільки дві цифри. Найбільш вдалим рішенням є використання чотирирозрядного запису років.

Приклад
var
   D: TDateTime;
   S: string;
begin
   D: = StrToDate ('04 .10.1999 ');
   S: = FormatDateTime ('d mmm yy р.', D); {S: = '4 жовтня 1999 '}
   MessageDlg (S, mtInformation, [mbOk], 0);
end;

 

Процедура ReplaceTime (var DateTime:TDateTime; const NewTime: TDateTime);
Опис

Процедура замінює значення часу у змінній DateTime на значення, вказане в параметрі NewTime. Значення дати залишається незмінним.

Приклад
var
    DateTime, NewDate: TDateTime;
    S: string;
begin
    S: = '28 .02.1999 23:37 ';
    DateTime: = StrToDateTime (S);
    NewTime: = StrToTime ('15: 00 ');
    ReplaceTime (DateTime, NewTime);
    S: = DateTimeToStr (DateTime);
    MessageDlg (S, mtInformation, [mbOk], 0);
end;

 

Процедура ReplaceDate (var DateTime:TDateTime; const NewDate: TDateTime);
Опис

Процедура замінює значення дати у змінній DateTime на значення, вказане в параметрі NewDate. Значення часу залишається не змінним.

Приклад
var
    DateTime, NewDate: TDateTime;
    S: string;
begin
    S: = '28 .02.1999 15:30 ';
    DateTime: = StrToDateTime (S);
    NewDate: = StrToDate ('29 .02.2000 ');
    ReplaceDate (DateTime, NewDate);
    S: = DateTimeToStr (DateTime);
    MessageDlg (S, mtInformation, [mbOk], 0);
end;

 

Функція Now: TDateTime;
Опис
Функція повертає значення поточної дати і часу в форміTDateTime.
Приклад
begin
    MessageDlg (DateTimeToStr (Now),mtInformation, [mbOk], 0);
end;

 

Функція IsLeapYear (Year: Word): Boolean;
Опис

Функція визначає, чи є високосним рік, зазначений у параметрі Year. Якщо рік високосний, то функція повертає True, а інакше -False.

Приклад
var
    S: string;
    Year, Month, Day: Word;
begin
    DecodeDate (Date, Year, Month, Day);
    If IsLeapYear (Year) then S: = 'високосний'
    else S: = 'не високосний';
    MessageDlg ('Поточний рік -' + S, mtInformation,[mbOk], 0);
end;

 

Функція IncMonth (const D: TDateTime NumberOfMonths: Integer): TDateTime;
Опис

Функція збільшує або зменшує значення дати,визначене в параметрі D, на вказане в параметрі NumberOfMonths кількість місяців. Якщо NumberOfMonths> 0, то значення дати збільшується, а якщо NumberOfMonths <0, то зменшується. Значення часу, визначене у значенні D, копіюється в результат один доодного. Якщо в результуючому значеннівиходить неіснуючий день місяця (Такаситуація виникає коли в отриманому місяці днів менше ніж у вихідному. Наприклад, 31 березня), то в результат записується останній день отриманого місяця.

Приклад
var
    D, Date2, Date3: TDateTime;
begin
    D: = EncodeDate (1999, 1, 31);
    Date2: = IncMonth (Date, 1); {Date2: = '28 .02.99'}
    Date3: = IncMonth (Date, -2); {Date3: = '30.11.98 '}
    MessageDlg (DateToStr (Date2) + # 13 +DateToStr (Date3), mtInformation, [mbOk], 0);
end;

 

Функція EncodeTime (Hour, Min, Sec, MSec:Word): TDateTime;
Опис

Функція перетворює значення годин, хвилин,секунд і мілісекунд, переданих в параметрах Hour, Min, Sec, MSec відповідно, в значеннятипу TDateTime. Вхідні значення повинні мати допустимі величини: Hour - 0 .. 23; Min - 0 .. 59;Sec - 0 .. 59; MSec - 0 .. 999. Якщо значеннявиходять за межі заданих діапазонів, то виникає виняток EConvertError. Функція повертає значення в діапазоні [0 .. 1).Результуюче значення визначає частину дня, що пройшла до зазначеного часу (наприклад, 0- опівночі, 0.5 - полудень, 0.75 - 18:00 і т.д.).

Приклад
var
    T: TDateTime;
begin
    T: = EncodeTime (7, 30, 0, 0);
    MessageDlg (TimeToStr (T), mtInformation,[mbOk], 0);
end;

 

Функція EncodeDate (Year, Month, Day: Word):TDateTime;
Опис

Функція перетворює значення року, місяця і дня, передані в параметрах Year, Month і Day, відповідно, в значення типу TDateTime. Вхідні значення повинні мати допустимі величини: дляYear - 1 .. 9999; для Month - 1 .. 12; для Day - від1 до 28, 29, 30, або 31, залежно від значення Month. Наприклад, якщо Month = 2 (лютий), то значення Day повинно лежати в межах 1 .. 28 або  1 .. 29, в залежності від того, представляє значення Year високосний рік або невисокосний. Якщо значення виходять за межідопустимих діапазонів, то виникає виняток EConvertError.

Приклад
var
    D: TDateTime;
begin
    D: = EncodeDate (1999, 2, 23);
    MessageDlg (DateToStr (D), mtInformation,[mbOk], 0);
end;

 

Процедура DecodeTime (T: TDateTime; var Hour,Min, Sec, MSec: Word);
Опис

Процедура повертає значення годин (Hour),хвилин (Min), секунд (Sec) і мілісекунд (MSec)для значення часу вказаного в форматі TDateTime. Початкове значення передається в параметрі T. Якщо значення T <=0 або не містить значення часу, то процедура повертає у всіх змінних 0.

Приклад
var
    D: TDateTime;
    Hour, Min, Sec, MSec: Word;
begin
    D: = Now;
    DecodeTime (D, Hour, Min, Sec, MSec);
    MessageDlg ('Поточний час:' + IntToStr (Hour) +'ч.' + IntToStr (Min) + 'хв.' + IntToStr (Sec) + 'сек.',mtInformation, [mbOk], 0);
end;

 

Процедура DecodeDate (D: TDateTime; var Year,Month, Day: Word);
Опис

Процедура повертає рік (Year) місяць (Month) ідень (Day) дати, значення якої вказано у форматіTDateTime. Вхідна дата передається в параметрі D. Якщо значення D <= 0 або не містить значення дати, то в змінні Year, Month,Day записується 0.

Приклад
var
    D: TDateTime;
    Year, Month, Day: Word;
begin
    D: = Now;
    DecodeDate (D, Year, Month, Day);
    MessageDlg ('Сегодня ' + # 13 # 13 + 'Кількість:'+ IntToStr (Day) + # 13 + 'Місяць:' + IntToStr(Month) + # 13 + 'Рік:' + IntToStr (Year),mtInformation, [mbOk], 0);
end;

 

Функція DayOfWeek (Date: TDateTime): Integer;
Опис

Функція повертає порядковий номер дня тижня(1 ... 7) для дати, визначеної параметром Date (1- неділя, 2 - понеділок, ..., 7 - субота).

Приклад
var
    S: string;
begin
    case DayOfWeek (Date) of
      1: S: = 'вихідний';
      2: S: = 'важкий день';
      3: S: = 'сірі робочі будні';
      4: S: = 'сірі робочі будні';
      5: S: = 'сірі робочі будні';
      6: S: = 'короткий день';
      7: S: = 'вихідний';
    end;
    MessageDlg ('Сьогодні ' + S, mtInformation,[mbOk], 0);
end;

 

function DayOfTheMonth (const Date: TDateTime):Word;
Опис

Функція DayOfTheMonth повертає індексний номер дня місяця. Залежно від року й місяця, значення знаходиться в діапазоні 1 .. 31

Приклад
var
   myDate: TDateTime;
begin
   myDate: = EncodeDate (2002, 12, 31);
   ShowMessage ('День місяця =' + IntToStr(DayOfTheMonth (myDate)));
end;

 

function DayOfTheWeek (const Date: TDateTime):Integer;
Опис
Функція DayOfTheWeek повертає індекс днятижня:
1 = понеділок
2 = вівторок
3 = середа
4 = четвер
5 = п'ятниця
6 = субота
7 = неділя
DayOfTheWeek  стандартизована з ISO 8601, так яквона використовує Понеділок як початок тижня. DayOfWeek НЕ стандартизована - вона обробляє неділю як перший день.
Приклад
var
   myDate: TDateTime;
   day: array [1 .. 7] of string;
begin

   day [1]: = 'понеділок';
   day [2]: = 'вівторок';
   day [3]: = 'середа';
   day [4]: = 'четвер';
   day [5]: = 'п'ятниця';
   day [6]: = 'субота';
   day [7]: = 'Неділя';
   myDate: = EncodeDate (2002, 12, 25);
   ShowMessage ('Різдво 2002р.' + day[DayOfTheWeek (myDate)]);
end;

 

function DayOfTheYear (const Date: TDateTime):Word;
Опис

Функція DayOfTheYear повертає індекс дня року. Залежно від року, значення знаходиться вдіапазоні 1 .. 366

Приклад
var
   myDate: TDateTime;
begin
   myDate: = EncodeDate (2002, 10, 29);
   ShowMessage ('20 / 10/2002 день року = '+
               IntToStr (DayOfTheYear (myDate)));
end;

 

function DaysBetween (const ToDate, FromDate:TDateTime): Integer;
Опис
Функція DaysBetween обраховує різницю FromDate з ToDate, повертаючи її в цілих днях.
Приклад
var
   fromdate, toDate: TDateTime;
begin

   fromDate: = EncodeDateTime (2000, 02, 26, 10,0, 0, 0);
   toDate: = EncodeDateTime (2000, 02, 29, 9, 0, 0, 0);

   ShowMessage ('З дати =' + DateTimeToStr(fromDate));
   ShowMessage ('До дати =' + DateTimeToStr(toDate));
   ShowMessage ('Цілих днів =' +
   IntToStr (DaysBetween (toDate,fromDate)) + 'днів');
end;

 

function DaysInAMonth (const Year, Month: Word):Word;
Опис
Функція DaysInAMonth видає кількість днів у вказаному Році, Місяці.
Приклад
begin

   ShowMessage ('Днів в Лютому 2000 =' +
   IntToStr (DaysInAMonth (2000, 2)));
end;
 

function DaysInAYear (const Year: Word): Word;
Опис
Функція DaysInAYear видає кількість днів у даному Році. Рік може бути в діапазоні 0 .. 9999
Приклад
begin
   ShowMessage ('Днів у 2000р. =' +
               IntToStr (DaysInAYear (2000)));
end;

 

function DaySpan (const ToDate, FromDate:TDateTime): Double;

Опис
Функція DaySpan віднімає FromDate із ToDate,повертаючи дробову різницю днів. Повернене Double значення містить число  днів як цілу частину, і залишок частини дня як дробову частину. Наприклад, різниця 2 днів і 6 годин дало б значення 2.25

Приклад
var
   fromdate, toDate: TDateTime;
begin

   fromDate: = EncodeDateTime (2000, 01, 01, 0, 0,0, 0);
   toDate: = EncodeDateTime (2000, 01, 02, 12, 0,0, 0);

   ShowMessage ('З дати =' + DateTimeToStr(fromDate));
   ShowMessage ('До дати =' + DateTimeToStr(toDate));
   ShowMessage ('Дробова різниця днів =' +
               FloatToStr (DaySpan (toDate, fromDate))+ 'днів');
end;

 

function IncMinute (const StartDateTime:TDateTime {; NumberOfMinutes: Integer = 1}):TDateTime;
Опис
Функція IncMinute повертає значення TDateTime, яке на NumberOfMinutes хвилин більше, ніж передане значення StartDateTime. Рік, місяць, день і значення годин збільшуються відповідно. Значення приросту єдовільним (за замовченням 1). Функції DecMinute немає. Замість цього, використовуйте IncMinute з негативним приростом.

Приклад
var
   myDate: TDateTime;
begin

   myDate: = EncodeDateTime (2000, 12, 31, 23, 0,0, 0);
   ShowMessage ('myDate =' + DateTimeToStr(myDate));

   myDate: = IncMinute (myDate, 100);
   ShowMessage ('myDate + 100 хвилин =' +DateTimeToStr (myDate));

   myDate: = IncMinute (myDate, -40);
   ShowMessage ('myDate - 40 хвилин =' +DateTimeToStr (myDate));
end;

 

function IncSecond (const StartDateTime:TDateTime {; NumberOfSeconds: Integer = 1}):TDateTime;
Опис

Функція IncSecond повертає значення TDateTime, яке на NumberOfSeconds секунд більше, ніж передане значення StartDateTime. Рік, місяць, день і значення годин збільшуються відповідно. Значення приросту єдовільним (за замовченням 1). Функції DecSecond немає. Замість цього, використовуйте IncSecond  з негативним приростом.

Приклад
var
   myDate: TDateTime;
begin

   myDate: = EncodeDateTime (2005, 12, 31, 23,59, 0, 0);
   ShowMessage ('myDate =' + DateTimeToStr(myDate));

   myDate: = IncSecond (myDate, 60);
   ShowMessage ('myDate + 100 seconds =' +DateTimeToStr (myDate));

   myDate: = IncSecond (myDate, -120);
   ShowMessage ('myDate - 120 seconds =' +DateTimeToStr (myDate));
end;

 

function IncYear (const StartDate: TDateTime {;NumberOfYears: Integer = 1}): TDateTime;
Опис

Функція IncYear повертає значення TDateTime,яке на NumberOfYears років більше, ніж передане значення StartDateTime. Значення приросту є довільним (за замовченням 1). Після збільшення року, якщо значення дня занадто велике для отриманого місяця / року,то воно зменшується до найвищого значення отриманого місяця / року. Функції DecYear немає. Замість цього, використовуйте IncYear  з негативним приростом.

Приклад
var
   myDate: TDateTime;
begin

   myDate: = EncodeDate (2000, 02, 29);
   ShowMessage ('myDate =' + DateToStr(myDate));

   myDate: = IncYear (myDate, 2);
   ShowMessage ('myDate + 2 years =' +DateToStr (myDate));

   myDate: = IncYear (myDate, -2);
   ShowMessage ('myDate - 2 years =' + DateToStr(myDate));
end;

 

function MonthOfTheYear (const Date: TDateTime):Word;
Опис

Функція MonthOfTheYear повертає індексний номер  місяця року. Значення знаходиться в діапазоні від 1 (січень) до12 (грудень).

Приклад
var
   myDate: TDateTime;
begin
   myDate: = EncodeDate (2002, 10, 29);
   ShowMessage ('Місяць року =' +
               IntToStr (MonthOfTheYear (myDate)));
end;

 

function Tomorrow: TDateTime;
Опис

Функція Tomorrow повертає дату завтрашнього дня в місцевому часовому поясі. Через те, що повертається значення типу TDateTime, час встановлюється в 0 (початок дня).

Приклад
begin
   ShowMessage ('Вчора =' + DateToStr(Yesterday));
   ShowMessage ('Сьогодні =' + DateToStr (Date));
   ShowMessage ('Завтра =' + DateToStr(Tomorrow));
   ShowMessage ('Завтрашнє час =' + TimeToStr(Tomorrow));
end;

function Yesterday: TDateTime;
Опис

Функція Yesterday повертає вчорашню дату в місцевому часовому поясі. Оскільки повертається значення – тип TDateTime, компонент часу встановлено на нуль.


Приклад
begin
   ShowMessage ('Вчора =' + DateToStr(Yesterday));
   ShowMessage ('Сьогодні =' + DateToStr (Date));
   ShowMessage ('Завтра =' + DateToStr(tomorrow));
   ShowMessage ('Завтрашнє час =' + TimeToStr(Yesterday));
end;

Tags: