Сегодня столкнулся с откровенной подставой со стороны Excel. Исходные данные:
- файл в формате Excel 2003, полученный извне, в нем несколько колонок с датами и установленным форматом ячеек "Дата" (дд.мм.гггг)
- Excel 2010 версии 14.0.6024.1000
- переписанное на .NET семейство классов SysExcel, с помощью которого читаются данные
- в SysExcelRange для удобства добавлен метод, который читает значение ячейки с помощью get_Value2() и возвращает его сконвертированным в желаемый базовый аксаптовский тип.
Так вот, оказалось, что для этих ячеек типа "Дата" методы get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType::xlRangeValueDefault) и get_Value2() возвращают значения разных типов: первый - типа System.DateTime с нормальной датой/временем (той, которую я вижу в файле), а второй - типа System.Double со значением числа дней от начала "эпохи",
НО! когда это значение скармливаешь аксаптовской функции num2date(), получается дата на 2 дня позже, чем в файле!

Я в принципе
наслышан про "особенности" Excel в плане работы с датами, но вот чтоб такие подставы... В общем, я переделал SysExcelRange на использование get_Value(), и все рассосалось.