ЧАСТЬ 3. Совместимость с 2000 годом отдельных продуктов


В этой части мы рассмотрим, как воспринимают и хранят значение даты некоторые програмные продукты известных фирм.


Компьютерные календари

В каждом персональном компьютере работает по крайней мере 3 календаря. Первичным источником времени и даты являются "часы реального времени" - Real Time Clock или сокращено RTC. Это микросхема, которая работает (вместе с CMOS, в который она входит) даже при выключенном питании компьютера. Типичным представителем является серия микросхем MC146818 компании Motorola. Обычно микросхемы других фирм функционально совместимы с ней.

Следующий уровень - часы и календарь BIOS. BIOS запрашивает дату из RTC при загрузке компьютера, а также по "требованию" программ (например, операционной системы или приложений).

Третий обязательный уровень - календарь операционной системы. Операционные системы Microsoft запрашивают дату из BIOS при загрузке. Некоторые операционные системы запрашивают напрямую RTC. Команда MS-DOS DATE и соответствующие программы Windows изменяют дату одновременно во всех трех календарях.


В большинстве микросхем RTC для представления года используются лишь 2 цифры. Следовательно после года 99 они покажут 00. BIOS воспримет это как 1900 г., а MS-DOS в ответ на это установит свою базовую дату 4 янв. 1980 г.

С 1994 г. в некоторых (а с 1995 г. во многих) CMOS появился "байт века", в котором можно отметить факт наступления 2000 года. Но до 1996 г. большинство BIOS не умели его устанавливать автоматически.

В таких компьютерах 2000 год достаточно один раз установить с помощью команды DATE или какой-либо программы. После этого календари будут правильно показывать даты следующего века. В новейших BIOS байт века устанавливается автоматически. Но одни умеют это делать лишь в процессе загрузки компьютера, а другие "ловят" появление в RTC года 00 и сами переводят календарь на 2000 год. Некоторым BIOS для перехвата 00 и перехода на 2000 год требуется довольно много времени (до 2 секунд). В этом интервале они не способны выдавать время по запросам ОС или приложений. Машины с таким BIOS не стоит использовать в качестве круглосуточных серверов.

Поскольку компании, выпускающие RTC и BIOS, меняли их свойства несколько раз в год, необходимо проверить каждый компьютер. Проверку перехода календарей на 2000 год надо проводить как при включенном компьютере,так и при выключенном (часы RTC продолжают идти).

Тестирующие программы

Существует ряд свободно распространяемых программ, которые позволяют проверить переход календарей на 2000 год.

Viewcmos.exe компании RighTime Company. Показывает текущее состояние трех календарей. позволяет визуально проверить работу календарей. Может запускаться как из MS-DOS, так и из Windows. Не меняет состояние календарей и совершенно безобидна.

mcheck11.exe компании Unicore проверяет переход календарей на 2000 год при включенном компьютере. Запускается только из DOS (Win 3.11 надо предварительно закрыть, Win 95, NT - перезагрузить в режиме эмуляции MS-DOS). Запоминает текущее значение всех часов, автоматически устанавливает 31 дек.1999 г. 23:59:55, а затем выводит на экран состояние календарей за последние 5 с. 1999 г. и первые 5 с. 2000 г. Затем восстанавливает значение всех часов, добавив 10 с.
Позволяет визуально проследить, какой из календарей переключился на 2000 год. Проверяет наличие байта века.

2000.exe компании NSTL - одна из самых популярных программ. Входит в семейство YMark2000. Более строго проверяет все, что делает и mcheck11, кроме того проверяет правильность отработки високосных годов в интервале 2000 - 2009 гг. (некоторые BIOS не считают 2000 г. високосным), тестирует RTC на совместимость с MC146818. Проверяет переход на 2000 год как в режиме непрерывной работы, так и в режиме загрузки после наступления 2000 года. Запускается только из MS-DOS. (Win 3.11 надо предварительно закрыть, Win 95, NT - перезагрузить в режиме эмуляции MS-DOS). Кроме сообщений, выводимых на экран (на английском языке) программа возвращает операционной системе определенные коды. Эти коды можно проверить в bat - файле (ON ERROR) и организовать выдачу сообщений на русском. Программа "гуляет" по свету в виде самораскрывающего архива y2000.exe вместе с файлом Readme.txt.

Существует еще ряд программ, которые либо распространяются свободно (как перечисленные здесь), либо продаются. Например, Y2KPCPro.Com компании RighTime выполняет комплексное тестирование календарей. В ходе тестирования компьютер 2 раза перезагружается, один раз программа просит выключить питание.

Подробную информацию о работе BIOS в 2000 году можно прочитать на Web-серверах компаний - производителей BIOS (см. раздел 5).

1. Продукты Microsoft

Компания объявила, что все ее продукты, выпущенные после 1996 г. полностью совместимы с 2000 годом. Компания рекомендует обновить старые версии операционных систем и прикладных программ на продукты, выпущенные в 1997 г. Однако, вряд ли все пользователи имеют такую возможность. Поэтому, рассмотрим как новые, так и некоторые старые программные продукты.

1.1. Операционные системы.

(материал опубликован в еженедельнике "Компьютер-ИНФО",1998 г., №№ 19, 20, 22).

Все операционные системы Microsoft (кроме Windows 98) являются "почти совместимыми с 2000 годом". Это означает, что в системах имеются незначительные ошибки, как правило, не влияющие на функционирование прикладных программ. ОС Windows 98 считается полностью совместимой с 2000 годом. Для всех ОС созданы или создаются программы, исправляющие ошибки в представлении и обработке дат.

Компания Microsoft приводит следующие сведения о совместимости своих ОС с 2000 годом:

MS-DOS 6.22 (Release Date: May 31, 1994).

Система позволяет оперировать с датами до 2035 г. При загрузке MS-DOS текущее значение даты выбирается из PC BIOS. Система не высвечивает полное значение даты создания и изменения файлов, однако сортировка файлов выполняется корректно.
Функции API файловой системы возвращают разность между текущим значением года и 1980. Программисты, создающие приложения с использованием API MS-DOS, должны предусмотреть сложение полученного от функций значения с числом 1980.
Пользователь может изменить текущее значение даты только с помощью команды DATE. При вводе двух цифр года дата по умолчанию относится к ХХ веку (например дата 02-12-82 будет относиться к 1982 году). Двузначные значения даты в диапазоне 00-79 команда DATE не воспринимает и выдает сообщение "Invalid Date". При вводе 4-х цифр даты, значения, относящиеся к XXI веку, воспринимаются и обрабатываются правильно. Т.о., нельзя ввести дату 01-01-00, но можно 01-01-2000.
По команде DIR не высвечиваются 4 цифры даты.

Утилита MSBACKUP в именах выходных файлов использует значения даты в формате YMMDD, т.е., файлы, созданные например, в 1998 г. и 2008 г. будут рассматриваться утилитой, как созданные в один и тот же год. В сообщениях утилиты даты, превышающие 1999 г., выводятся неверно, например, дата 8/29/2001, будет выводиться как 8-29-АС.

Компания Microsoft считает перечисленные ошибки несущественными для функционирования системы, поэтому никаких средств их исправления не предусмотрено.

Windows 3.1, Windows for Workgroups 3.11.

Поддерживает даты до 2036 г. Система требует обновления Диспетчера файлов WINFILE.EXE. Новая версия Диспетчера файлов может быть загружена с ftp-сервера Microsoft (ftp://ftp.microsoft.com/softlib/mslfiles/wfwfilup.exe).
В программе Дата/Время (В окне "Панель управления") невозможно с помощью мыши установить дату 29 февраля 2000 г. При необходимости, следует ввести эту дату с клавиатуры. Программ, исправляющих эту ошибку, в настоящее время нет. Автоматически календарь системы правильно переключается с 28 на 29 февраля 2000 г.
Система работает в среде MS-DOS 6.22, поэтому в режиме DOS проявляются все ошибки, характерные для этой системы.

Windows 95(Version: 4.00.950, Engl., August 24,1995 ).

Требует обновления файлов WINFILE.EXE и COMMAND.COM. В обновленном COMMAND.COM команда MS-DOS DATE позволяет вводить как два, так и четыре знака даты. При вводе двух цифр в диапазоне 00-79 система воспримет их как 2000-2079. Программа Проводник (Explorer) поддерживает 4-х значное представление даты.

Старый Диспетчер файлов (WINFILE.EXE) не показывает даты, превышающие 1999 г. Для исправления этой ошибки необходимо загрузить с Ftp- сервера Microsoft новую версию файла WINFILE.EXE Version 4.00.951 dated 3/11/97 9:51a 155,456. Команды, входящие в COMMAND.COM, не выводят 4 цифры даты и могут воспринимать значения, превышающие 1999 неправильно.
Новые WINFILE.EXE и COММAND.COМ содержатся в файле WIN95Y2K.EXE, который находится по адресу: ftp://ftp.microsoft.com/softlib/mslfiles.
Перечисленные ошибки отсутствуют в последней версии OSR 2.

Еще одна ошибка присутствует в программе поиска файлов. В окне этой программы (Find File) выводятся лишь 2 цифры года и значения, относящиеся к следующему веку представляются неверно. Отдельная программа, исправляющая эту ошибку появится позже, однако при установке в системе Web-броузера Internet Explorer 4.0 все ошибки 2000 года исправляются автоматически.

Windows NT Workstation v. 4.0 (Release Date: 7/29/1996)


ОС поддерживает системные даты в интервале 1996-2036 г. Компания Microsoft сообщает о следующих ошибках:

Для устранения перечисленных ошибок необходимо выполнить следующие программы:
1. Microsoft Windows NT Service Pack 3: http://backoffice.microsoft.com/downtrial/moreinfo/nt4sp3.asp
2. Windows NT Year 2000 (Y2K) QFE Fixes:
http://backoffice.microsoft.com/downtrial/moreinfo/y2kfixes.asp" Внутренние форматы представления даты.
Для программ, поддерживающих Win32, в системе существуют две структуры для представления даты: FILETIME и SYSTEMTIME. Структура FILETIME имеет длину 64 бита и содержит количество интервалов длиной 100 наносекунд, которое прошло с 1 января 1601 г. UTC(coordinate universal time). В структуре SYSTEMTIME значение года содержит 16 двоичных разрядов. Для файловой системы FAT хранится приращение даты по отношению к 1980 г.

Более подробную информацию читатели могут получить на Web-сервере компании Microsoft: http://www.microsoft.com/year2000/

Windows NT Server, Standard and Enterprise Editions 4.0
(Release Date: 7/29/1996, English, US)

Для устранения перечисленных ошибок необходимо выполнить следующие программы:

Более подробную информацию читатели могут получить на Web-сервере компании Microsoft: http://support.microsoft.com/support/

1.2. Базы данных и электронные таблицы.

В полях типа "дата" баз данных Microsoft Access, FoxPro, Visual FoxPro, Microsoft SQL Server всегда хранятся 4 цифры года, например, 1935 или 2001. Если в пользовательском интерфейсе также предусмотрены ввод и отображение 4-х цифр, а в процессе преобразования дат цифры, относящиеся к столетию не урезаются, проблем с 2000 годом не будет.

Проблемы могут возникнуть в случаях, когда пользователи вводят лишь две цифры года, например, 89 вместо 1989 или в прикладной программе значение года урезается до двух цифр. В процессе преобразования к двум цифрам года автоматически ( по умолчанию) добавятся еще две цифры, относящиеся к столетию. К сожалению, различные продукты Microsoft используют различные умолчания:

* Excel версий 4,5 и 7 значения года 00-19 преобразует в 2000-2019, а значения года 20 -99 в 1920-1999;

* Excel 97 значения 00-29 преобразует в 2000-2029, а значения 30 -99 в 1920-1999;

* Access версий 1,2 и 7 значения года 00-99 преобразует в 1900-1999, ввод даты, относящейся к 21-му веку с попмощью двух цифр невозможен;

* Access 97 значения 00-29 преобразует в 2000-2029, а значения 30 -99 в 1920-1999;

Эти правила отражены на рис. 1.

рисунок 1

Рис.1

Из рисунка хорошо видно, что, если пользователь привык вводить лишь две цифры года, при смене версий програмных продуктов очень велика вероятность ошибок. Нетрудно представить такую картину: пенсионер обращается в одно из учреждений (поликлинику, собес, нотариальную контору и т.п.), чтобы оформить какой-либо документ. Дежурная привычно вводит его паспортные данные и в частности, дату рождения, например 25/06/28. Если эти данные заносятся в таблицу Excel 97 или Access 97, то по умолчанию в файл запишется дата 25 июня 2028 г.!

Ошибки не произойдет, если всегда вводить 4 цифры года. Однако, важно, чтобы и отображалась дата в полном формате.

рисунок 2

Рис. 2

Из рис. 2 видно, что при сокращенном формате представления ( колонка "B") отличающиеся на 100 лет даты выглядят одинаково и обнаружить визуально ошибки невозможно. В примере колонка "C" является копией колонки "B", но данные представлены в полном формате.

В пакетах Microsoft Works for Windows, FoxPro и Visual FoxPro, SQL Server к двум цифрам года всегда добавляется префикс 19, т.е., 12/05/10 воспримется как 12/05/1910.

В Системе программирования Visual Basic версий с 2.0 по 3.1 двузначные даты относятся к ТЕКУЩЕМУ веку. В 32-разрядных версиях Visual Basic 4 и 5 в разных функциях обработки даты используются РАЗНЫЕ умолчания. Программистам необходимо внимательно читать документацию и информцию на Web-сервере Microsoft.

2. Базы данных, работающие с форматами DBF

В восьмедесятые годы широкую популярность приобрели реляционные СУБД dBASE для персональных ЭВМ, созданные небольшой компанией Ashton Tate. Эта же компания предложила и очень простой формат файлов для хранения реляционных таблиц, который получил название DBF. Успех пакетов dBASE II, а затем dBASE III вызвал появление параллельных разработок, в которых за основу были взяты язык программирования dBASE и форматы файлов DBF.

Наибольшую популярность в нашей стране получили системы Clipper компании Nantucket и FoxPro компании Fox Software. Популярность перечисленных программных продуктов стала причиной их поглощения "акулами" программного обеспчения. Так dBASE стала собственностью компании Borland, Clipper - Computer Associates и FoxPro - Microsoft.

В файлах DBF занчения даты хранятся в формате, предписаном стандартом ANSI: YYYYMMDD, например, 19890205 означает 5 февраля 1989 г. Такой же формат предписывается и международным стандартом ISO 8601:1988 и нашим ГОСТ 7.64-90. Как видим, в файлах информация о столетии присутствует всегда. Однако, пользовательский интерфейс утилит и оболочек, поставлявшихся с этими системами, а также прикладных программ, созданных по заказам предприятий, ориентирован на ввод лишь двух цифр года.

Все системы, работающие с форматами DBF, к двузначному значению года добавляют префикс 19. Например, 05.02.10 воспримется, как 05.02.1910, 31.11.98 - как 31.11.1998 и т.д. Вввод значения года 00 не допускается. Т.о., даты, относящиеся к XXI веку, с помощью двух цифр ввести нельзя. Однако язык программирования во всех версиях продуктов допускает ввод четырех цифр года. Пусть например, имеется файл 2000.dbf, с полем dat1 типа "Date". Фрагмент демонстрационной программы для FoxPro 2.6 (ее без труда поймут и программисты, пишущие для Clipper и dBASE) может иметь вид:

Set date british
..................
select 1
use 2000
vd1=ctod ("05/11/29")
append blank
replace dat1 with vd1
** в файл запишется 1929 г.
***********************

vd1= ctod ("20/03/2029")
append blank
replace dat1 with vd1
** в файл запишется 2029 г.

? vd1
** программа напечатает 20/03/29, т.е.
** информация о столетии при выводе
** теряется

В языке dBASE, начиная с версии III+, а также во всех версиях Clipper, FoxPro и Visual FoxPro имеется команда SET CENTURY ON, которая разрешает вывод и редактирование четырех цифр года:

set ccentury on
vd1= ctod ("20/03/2029")
? vd1
** программа напечатает 20/03/2029

Таким образом, доработка старых программ, для систем dBASE, Clipper и FoxPro должна предусматривать включение оператора SET SENTURY ON и расширение полей "Дата" в интерфейсе пользователя до 10 позиций вместо традиционных 8. Естественно, необходимо изменить и руководства пользователей.

В более поздних версиях перечисленных систем имеются и другие средства, позволяющие упростить переход от XX-го столетия к XXI-му. Так, в системе Clipper 5.0 и более поздних имеется оператор SET EPOCH TO <год>, SET DATE FORMAT и др.

Оператор SET EPOCH TO позволяет относить даты, состоящие из двух цифр к различным столетиям. Например,

SET EPOCH TO 1920
SET DATE FORMAT TO "dd/mm/yyyy"
?CTOD("05/12/15") // будет напечатано 05/12/2015
?CTOD("23/03/98") // будет напечатано 23/03/1998

Многие утилиты , например, DBU.EXE в старых версиях систем не позволяют вводить даты, относящиеся к XXI веку. Но, поскольку в лицензионую поставку продуктов входят и тексты утилит, опытные программисты могут их доработать.

3. Продукты компании Borland

Помимо пакета dBASE компания Borland поставляет еще СУБД Paradox и Interbase. Оба программных продукта позволяют в полях "дата" хранить значения даты в пределах нескольких десятков веков. При использовании четырех цифр для обозначения года, даты, относящиеся к различным векам обрабатываются правильно.

4. Продукты компании Novell

Компания Novell объявила, что все ее продукты разрабатывались совместимыми с 2000 годом. Однако, тестирование, проведенное самой компанией в 1997 г., выявило небольшие дефекты в отдельных версиях сетевых ОС и прикладных программ.

Для сетевых ОС NetWare всех версий, начиная с 3.12 выпущена программа-заплатка (patch), позволяющая автоматически проверять и при необходимости исправлять ошибки, связанные с обработкой дат. Система NetWare 3.11 исправлению не подлежит и должна быть заменена на более поздние версии.

Тестирование ряда пакетов в настоящее время продолжается. Текущую информацию о готовности продуктов компании можно получить на Web-сервере Novel. Ниже приводится таблица програмных продуктов, для которых созданы "дополнения" (patches), исправляющие ошибки 2000 года.

NetWare 4.11/intraNetWare Support Pack 5 включая Updates for NetWare 4.11/intraNetWare, intraNetWare for Small Business, SMP for NetWare v4.11 и NetWare SFTIII v4.11 (iwsp5b.exe)  Перейти на страницу загрузки
Year 2000 Update for NetWare 4.11/intraNetWare, intraNetWare for Small Business, SMP for NetWare v4.11 и NetWare SFTIII v4.11 (только Y2K Updates) (411Y2Kp2.EXE)  Перейти на страницу загрузки
Year 2000 Update for NetWare 4.11 for OS/2 (Требуется для OS/2) (411Y2Kp2.EXE)  Перейти на страницу загрузки
Year 2000 Update for NetWare 4.10 (no SFTIII, SMP, or OS2 support) Будет готова в 4 кварт.1998
Year 2000 Update for NetWare 3.12 (312y2kp2.exe) (До запуска Y2K patches необходимо выполнить все предыдущие программы "дополнения" (patches). Подробности читайте в файле readme в загружаемом "дополнении" (patch)) Перейти на страницу загрузки
Year 2000 Update for Novell Clients (clty2kp1.exe) Перейти на страницу загрузки
Year 2000 Update for Novell Administrator for Windows NT v2.0c (na4nty2k.exe) Перейти на страницу загрузки
Year 2000 Update for NetWare ConnectView v2.0 (ncv20y2k.exe) Перейти на страницу загрузки
Year 2000 Update for BorderManager v2.1 (English) (bm21y2k.exe) Перейти на страницу загрузки
Year 2000 Update for ManageWise v2.5 (mwnxp01a.exe) Перейти на страницу загрузки
Year 2000 Update for Lan WorkGroup 5.0 (lwp501.exe) Перейти на страницу загрузки
Year 2000 Update for Lan WorkPlace 5.0 (lwp501.exe) Перейти на страницу загрузки
Year 2000 Update for Lan WorkPlace Pro (lwp511.exe) Перейти на страницу загрузки
Year 2000 Update for Hostprint 1.11 (hpdef.exe) Перейти на страницу загрузки

5. Продукты компании Apple

Все компьютеры Macintosh позволяют устанавливать системную дату в пределах от 1 января 1920 г. до 31 декабря 2019 г. (в некоторых версиях ОС диапазон дат шире). ОС Rhapsody позволяет использовать системные даты до 2038 г. Переход от 1999 г к 2000 проблем не вызывает. Готовы к работе с датами XXI века и все утилиты для Macintosh. Совместимость с 2000 годом старых компьютеров Apple II зависит от применяемой ОС и программ обслуживания. Например, если компьютеры Apple IIgs, работают под ОС System 6.0, проблем с 2000 годом не будет. Более ранние Apple II, II+, IIe, IIc и IIc+ не имеют системного календаря.

В прикладных программах необходимо испольовать 4 цифры для обозначения года. В некоторых программах и ОС имеется возможность устанавливать пороговое значение для двузначного представления года (аналог оператора SET EPOCH TO), позволяющее автоматически добавлять либо префикс 19 либо 20.

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