Введення та виведення даних формату TDateTime Free Pascal

У системі Free Pascal кожна складова значення календарної дати та часу на нижньому рівні (рік, місяць, день, години, хвилини тощо) представлена ​​ціло- чисельним значенням типу Word. Тому з автономним введенням чи виводом кожною з них жодних проблем не виникає. Однак це не оптимальний спосіб, тому що в повсякденному житті ми користуємося рядом більш зручних способів символьної запису дат і часу. Ось лише деякі з них:

± 17/07/2000 або 17-07-2000 — варіанти компактного запису з іншими роздільниками;

± 17.07.00 – скорочений варіант компактного запису;

± 12 годин 35 хвилин - докладний запис часу;

± 12:35 - компактний запис часу.

Виникає природне бажання ввести символьний запис дати та часу в одному із встановлених форматів, а потім перетворити введений рядок у внутрішній формат TDateTime. Таку можливість демонструє програма з лістингу 14.1.

Листинг 1 4.1. Програма перетворення ф ор матів д а т date1

uses DateUtils, SysUtils; var

dt: TdateTime; s: string;

fmt : string = ‘dd.mm.yyyy hh:nn:ss';

write( 'Input Date : '); // запит дати

readln(s); // Введення рядка

dt := StrToDateTime(s); // Перетворення до TDateTime

writeln('Date = ',FormatDateTime(fmt,dt)); readln;

Протокол її роботи такий:

У цій же програмі продемонстровано спосіб зворотного перетворення дати з формату TDateTime у символьний рядок за допомогою функції FormatDate-Time.

Зверніть увагу на те, що будь-яка помилка в наборі дати, що вводиться може

спричинити аварійну ситуацію. Наприклад, якщо замість роздільника "точка" використовувати кому. Або замість допустимого номера дня, наприклад, набрати зна-чення 32:

An unhandled exception occurred at $0040CCC0 :

EConvertError : 2000-7-32 не є дійсним терміном визначення

Існують дві системні змінні, що визначають правила введення значень дат. Перша з них - ShortDateFormat - регулює порядок проходження компонентів дати. Друга – DateSeparator – визначає символ-розділювач між компонентами дати. Їхні значення за замовчуванням можна вивести для того, щоб познайомитися із встановленими правилами набору дати (листинг 14.2).

Листинг 14.2. Програма date2

uses DateUtils, SysUtils; begin

writeln( 'ShortDateFormat = ',ShortDateFormat); writeln('DateSeparator = ',DateSeparator); readln;

Результат свідчить, що порядок компонентів дати — день (одна чи дві цифри), місяць (одна чи дві цифри) і рік (чотири цифри).

А як роздільник складових дати використовується крапка:

Running "e:\fpc\myprog\date2.exe " ShortDateFormat =dd.MM.yyyyDateSeparator =.

Ви маєте право змінити значення будь-якої з цих змінних, і після такої зміни набудуть чинності нові правила набору дати (листинг 14.3).

Листинг 14.3. Програма date3

uses DateUtils, SysUtils; var

dt: TdateTime; s: string;

fmt : string = ‘dd.mm.yyyy hh:nn:ss'; begin

DateSeparator := '-'; // новий роздільник ShortDateFormat:='yyyy-mm-dd'; // нова послідовність даних write( 'Input Date : '); // запит дати

readln(s); // Введення рядка

dt := StrToDateTime(s); // перетворення до TDateTime writeln('Date = ',FormatDateTime(fmt,dt));

В результаті ми змінили порядок дотримання компонентів і замінили символ-розділювач:

Running "e:\fpc\myprog\date3.exe " Input Date :2000-07-1711:03:55

При введенні дати і часу замість повної групи компонентів ми можемо обмежитися набором лише одного або двох перших значень. У цьому випадку функція StrToDateTime дотримується наступної стратегії. Відсутні поля дати заповнюються системними (поточними) значеннями місяця та/або року. Відсутні поля часу заповнюються нульовими значеннями.

Функція ScanDateTime за своїм призначенням є аналогом функції StrToDateTime, але має дещо ширші можливості. У самому усіченому вигляді звернення до функції ScanDateTime містить два аргументи (лист 14.4).

Листинг 14.4. Програма date4

uses DateUtils, SysUtils; var

fmt2: string = ‘dd.mm.yyyy hh:nn:ss'; dt: TdateTime;

writeln('Date = ',FormatDateTime(fmt2,dt)); readln;

Перший аргумент функції ScanDateTime є шаблоном, що описує формат складових дати та часу у значенні другого аргументу (рядки s). Більш складна модифікація функції ScanDateTime передбачає завдання третього необов'язкового цілого параметра ind. У цьому випадку сканування рядка s починається із символу s[ind].

Для перетворення дати з формату TDateTime у рядок з тим чи іншим варіантом.

антом представлення значень календарної дати та показань комп'ютерного годинника використовується функція FormatDateTime:

s := FormatDateTime(Fmt, dt);

Ця функція повертає значення типу string, у якому значення дати та часу сформовані відповідно до форматних покажчиків у рядку Fmt. Список можливих форматних покажчиків наведено в табл. 14.2.

Еквівалент 'ddddd t' (короткі формати дати та часу)

День місяця (одна чи дві цифри - 1, 2, …, 9, 10, 11, …)

День місяця (дві цифри- 01, 02, ...)

День тижня (коротке символьне позначення)

День тижня (повне символьне позначення)

Місяць (одна чи дві цифри - 1, 2, …, 9, 10, 11, 12)