Век подходит к концу

Билл Карвин, InterBase Software Corporation.



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

Однако 1999 год не является концом света. Вчерашние герои, экономившие байты на хранении дат, сегодня являются только предметом насмешек на рынке дешевых накопителей данных.

2000 год является проблемой для программной индустрии. Когда количество лет представляется двумя цифрами вместо четырех, век становится невозможно определить.

Обычно мы предполагаем, что две цифры представляют год в 20 веке. Проблема в том, что если продолжать учитывать так же, то родившийся в 1997 году ребенок через 10 лет "окажется" в 1907 году. Нужно программное обеспечение, которое будет правильно хранить и сравнивать даты, где год состоит именно из четырех цифр.

При этом существуют две задачи: разбор даты и хранение даты.

Borland IB обеспечивает специальную интерпретацию двухцифрового года в 50-летнем интервале. Например, 28 февраля 48 года рассматриваетс как 1948, а 28 февраля 47 года – как 2047 год.

Это отлично работает для нынешней ситуации, однако не заменяет необходимости в использовании четырех цифр для года. Например, при вводе даты рождени 52-х летнего человека двумя цифрами, у вас получится, что он родился в 2045 году.

Исправить это можно только заменив ввод двухцифрового года на четырехцифровой. Или сразу пишите ваши приложения с учетом ввода четырехцифрового года.
 
Примечние ДК. Приложения, написанные на Delphi или C++Builder, используют чтение системных установок даты из Registry. Поэтому если вы не писали кода, ориентированного на 2 цифры года, то достаточно сменить настройки системы (Regional Settings). Чтобы навсегда установить четырехцифровой год в своих приложениях независимо от установок ОС – посмотрите раздел Delphi3.hlp "date/time formatting variables". Кроме этого рекомендуем при установке BDE сразу заглянуть в настройках на страничку даты.
В некоторых средах невозможно сконвертировать данные из старого формата. Например, представьте себе, что вы переносите данные из ASCII-файла в Borland IB. Между чтением и вставкой вам придется конвертировать двухцифровой год в четырехцифровой по вашим собственным правилам.

Такой контроль можно сделать автоматическим, например, при помощи триггера и пользовательской функции:
CREATE TRIGGER FIX_BIRTHDATES FOR PEOPLE_TABLE
BEFORE INSERT
AS
BEGIN
IF (NEW.BIRTHDATE > 'TODAY') THEN
NEW.BIRTHDATE = AddYear(NEW.BIRTHDATE, -100);
END

Функция AddYear() взята из FreeUDFLib, большого набора пользовательских функций.

Если же вы уверены, что кроме преобразования, которое автоматически осуществляется в Borland IB, вам ничего не нужно, то и никакого кода тоже писать не нужно. Пусть IB конвертирует даты. Однако помните, что IB динамически определяет диапазон в 50 лет в зависимости от текущего года. Т. е. в следующем году ввод 48 года приведет к хранению его как 2048 и т. д.

Также у IB не существует проблем с хранением данных после 2000 года. После 32768 года преобразование дат и их вывод переполнятся. Но такого диапазона достаточно практически для любых приложений, за исключением геологических или астрономических.

Дата хранится на диске как структура из двух 32-битных целых чисел. Первое число со знаком, хранит количество дней с 17 ноября 1858 года. Это дата, которую традиционно использует DEC (Digital Equipment Corporation) как эпохальную (дата основания Smithsonian Institute). Второе число беззнаковое и хранит тысячные доли секунды с полуночи.

IB API предоставляет две функции – isc_encode_date() и isc_decode_date(), которые конвертируют внутреннее представление даты IB в тип struct tm, хорошо известный программистам, использующим C.

IB хранит данные идентично на любой платформе и между версиями 3.x, 4.x и 5.x. Как только дата сохранена в БД, век хранится как часть данных, и когда дата извлекается – вы получаете год, состоящий из четырех цифр.

Вот и все.

Подпишитесь на новости Firebird в России

Подписаться