Введення та виведення даних формату 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)