Yoksel: Блог/2008?/01?/19?/ДатыВExcel ...
SourceForge.net Logo

Home Page | Изменения / НовыеКомментарии / Справка / Помочь проекту | Вход:  Пароль:  

Блог 2008 г.? 2008 г. январь? Excel? boost?

Даты в Excel


Даты в Excel хранятся в виде числа дней с 1 января 1900 года. Кстати, это легко проверить. Если ввести в Excel любую дату, начиная с 1 января 1900 года и дальше, то формат ячейки немедленно поменяется на «дату». Если же ввести дату меньшую 1900 года, то формат останется «Общим» – дата в этом случае сохраняется как обычный текст.


Вследствие выявленного глюка в Йокселе (некорретная обработка дат, меньших 1970 года), понадобилось решить эту проблему. Для решения была выбрана библиотека boost::date_time. По описанию крайне полезная вещь, приближающая работу с датами к уровню работы с датами из встроенного языка 1С. Т.е. вместо довольно неочевидных манипуляций с сишными структурами CRT предоставляется достаточно удобный набор классов, упрощающий операции с датами.


Библиотека был задействована следующим образом. Объект «дата» инициализировалась стартовой датой (31.12.1899). Далее к этой дате прибавлялось количество дней, хранящееся в ячейке Excel. При этом сразу выявилась небольшая проблема: даты, получаемые при помощи boost::date_time, на один день отличались от дат, реально хранящихся в листе Excel. Некоторое исследование вопроса, как ни странно, выявило ошибку в Excel. Дело в том, что Excel считает 1900 год високосным, хотя он им не является. Подробнее можно посмотреть в википедии. Поэтому для дат, больших 28 февраля 1900 года, пришлось ввести поправку на один день. Впрочем, boost тоже оказался небезгрешным. Библиотека правильно считает, что 1900 год не является високосным. Однако, 2100-й год, который тоже не високосный, boost ошибочно считает таковым. К счастью, это его мнение на этот раз совпадает с мнением Excel'я.

Некоторые технические детали

Для корректной работы библиотеки boost::date_time необходимо одновременно подключить заголовки «boost/date_time/gregorian/gregorian_types.hpp» и «boost/date_time/gregorian/gregorian_io.hpp». В документации написано, что для одновременной поддержки типов и ввода-вывода достаточно одного «boost/date_time/gregorian/gregorian.hpp» однако на опыте оказывается не так.


Также для поддержки форматированного вывода дат необходимо первым подключить «boost/date_time/gregorian/conversion.hpp».


Для корректной компиляции проекта в опциях компилятора необходимо добавить ключ -Qoption,c,--arg_dep_lookup. Этот ключ указывает компилятору на необходимость использования ADL (argument-dependent lookup).


Вообще, возникает подозрение, что на VC6 date_time не будет работать вообще :) VC6 об ADL вроде бы вообще не имеет понятия.


Ссылок на эту страницу нет


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]