понедельник, 29 января 2007 г.

Проблема 2038

Стандартная библиотека C++ не предоставляет подходящего типа данных для дат. C++ наследует структуры и функции для работы с датами и временем от C.

В C для представления даты/времени используется тип time_t. Это зависимый от реализации арифметический тип (в разных реализациях C/C++ может представлять различный диапазон значений), представляющий временной период (интервал времени) с точностью до одной секунды.

В большинстве реализаций time_t позволяет представить наибольший интервал времени в 2147483648 секунд. Это примерно 68 лет. Также в большинстве реализаций для представления текущего времени в качестве начала отсчёта используют 0:00:00 1 января 1970 года.

Т.е. в большинстве популярных реализаций невозможно представить даты и времена после 2038 года, и большая часть программного обеспечения перестанет работать, если заранее не принять меры!

В Visual C++ 2005 time_t является синонимом __time64_t, т.е. способен представить больший интервал и не подвержен ошибке 2038. Однако, это препятствует переносимости кода. Чтобы использовать обычный 32-битный time_t следует определить _USE_32BIT_TIME_T.

В Boost есть хорошая библиотека date_time, не подверженая проблеме 2038. Ожидается, что будущие средства стандартной библиотеки для работы с датой/временем будут основаны на date_time.

Комментариев нет: