Главная » Free Pascal » Ввод и вывод данных формата TDateTime Free Pascal

0

В системе Free Pascal каждая составляющая значения календарной даты и вре- мени на нижнем уровне (год, месяц, день, часы, минуты и т. д.) представлена цело- численным значением типа Word. Поэтому с автономным вводом или выводом каж- дой из них никаких проблем не возникает. Однако это не самый оптимальный способ, т. к. в обыденной жизни мы пользуемся рядом более удобных способов символьной записи дат и времени. Вот лишь некоторые из них:

± 17 июля 2000 г. — подробная запись даты;

± 17.07.2000 — компактная запись даты;

± 17/07/2000 или 17-07-2000 — варианты компактной записи с другими раздели- телями;

± 17.07.00 — сокращенный вариант компактной записи;

± 12 часов 35 минут — подробная запись времени;

± 12:35 — компактная запись времени.

Возникает естественное желание ввести символьную запись даты и времени в одном из установленных форматов и затем преобразовать введенную строку во внутренний формат TDateTime. Такую возможность демонстрирует программа из листинга 14.1.

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

program date1;

uses DateUtils, SysUtils; var

dt : TdateTime; s : string;

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

begin

write(‘Input Date : ‘);  // запрос даты

readln(s);              // ввод строки

dt := StrToDateTime(s);  // преобразование к TDateTime

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

end.

Протокол ее работы таков:

Running "e:\fpc\2.2.4\bin\i386-win32\date1.exe " Input Date : 17.07.2000 11:03:55

Date = 17.07.2000 11:03:55

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

Обратите внимание на то, что любая ошибка в наборе вводимой даты может

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

Running "e:\fpc\2.2.4\bin\i386-win32\date1.exe " Input Date : 32.07.2000 11:03:55

An unhandled exception occurred at $0040CCC0 :

EConvertError : 2000-7-32 is not a valid date specification

Существуют две системные переменные, определяющие правила ввода значе- ний дат. Первая из них — ShortDateFormat — регулирует порядок следования компонентов даты. Вторая — DateSeparator — определяет символ-разделитель между компонентами даты. Их значения по умолчанию можно вывести для того, чтобы познакомиться с установленными правилами набора даты (листинг 14.2).

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

program date2;

uses DateUtils, SysUtils; begin

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

end.

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

А в качестве разделителя составляющих даты используется точка:

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

Вы имеете право изменить значение любой из этих переменных, и после такого изменения вступят в строй новые правила набора даты (листинг 14.3).

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

program 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));

readln; end.

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

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

Date = 17.07.2000 11:03:55

При вводе даты и времени вместо полной группы их компонентов мы можем ограничиться набором только одного или двух первых значений. В этом случае функция StrToDateTime придерживается следующей стратегии. Недостающие поля даты заполняются системными (текущими) значениями месяца и/или года. Недос- тающие поля времени заполняются нулевыми значениями.

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

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

program date4;

uses DateUtils, SysUtils; var

fmt1: string = ‘hh:nn:ss dd.mm.yyyy'; s  : string = ’11:03:55 17.07.2000′;

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

begin

dt := ScanDateTime(fmt1,s);

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

end.

Протокол работы программы date4.pas таков: Running "e:\fpc\2.2.4\bin\i386-win32\date4.exe " Date = 17.07.2000 11:03:55

Первый аргумент функции ScanDateTime представляет собой шаблон, описы- вающий формат составляющих даты и времени в значении второго аргумента (строки s). Более сложная модификация функции ScanDateTime предусматривает задание третьего необязательного целочисленного параметра ind. В этом случае сканирование строки s начинается с символа s[ind].

Для преобразования даты из формата TDateTime в строку с тем или иным вари-

антом представления значений календарной даты и показаний компьютерных часов используется функция FormatDateTime:

s := FormatDateTime(Fmt, dt);

Эта функция возвращает значение типа string, в котором значения даты и вре- мени сформированы в соответствии с форматными указателями в строке Fmt. Спи- сок возможных форматных указателей приведен в табл. 14.2.

Таблица 14.2

Указатель

Пояснение

c

Эквивалент ‘ddddd t’ (короткие форматы даты и времени)

d

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

dd

День месяца (две цифры — 01, 02, …)

ddd

День недели (короткое символьное обозначение)

dddd

День недели (полное символьное обозначение)

ddddd

Короткий формат даты (например, 21.11.2009)

Таблица 14.2 (окончание)

Указатель

Пояснение

m

Месяц (одна или две цифры — 1, 2, …, 9, 10, 11, 12)

mm

Месяц (две цифры — 01, 02, …, 12)

mmm

Месяц (короткое символьное обозначение)

mmmm

Месяц (полное символьное обозначение)

y

Год (1 или 2 цифры)

yy

Год (2 цифры)

yyyy

Год (4 цифры)

h

Часы (1 или 2 цифры)

hh

Часы (2 цифры)

n

Минуты (1 или 2 цифры)

nn

Минуты (2 цифры)

s

Секунды (1 или 2 цифры)

ss

Секунды (2 цифры)

t

Короткий формат времени (например, 19:53)

tt

Длинный формат времени (например, 19:53:27.312)

am/pm

12-часовой формат с добавкой am или pm

a/p

12-часовой формат с добавкой a или p

/

Вставка разделителя в датах (обычно — точки)

:

Вставка разделителя во времени (обычно — двоеточия)

‘xxx’

Вставка литерального текста xxx

"xxx"

Вставка литерального текста xxx

z

Миллисекунды (z, zz или zzz)

При работе с русифицированной операционной системой использование сим- вольных обозначений для дней недели и месяцев может привести к нераспознавае- мым символьным сочетаниям. Это связано с разницей в кодировке обозначений компонентов календаря, используемой в операционной системе, и кодировкой сим- вольных данных в консольном приложении системы FP. В оригинальной операци- онной системе с установкой соответствующего англоязычного региона никаких проблем с выводом символьных обозначений дней недели и месяцев не возникает.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии