Привет всем!
Помогите плиз кто знает!
Читаю из DBFки напрямую и не могу понять в каком виде хранятся значения типа DateTime, DBFка из-под VFP 6 SP2. Я работаю в MSVC++.
Re: Как хранятся Date Time в DBF
От:
Аноним
Дата:
24.04.02 04:51
Оценка:
Здравствуйте Shad, Вы писали:
S>Читаю из DBFки напрямую и не могу понять в каком виде хранятся значения типа DateTime, DBFка из-под VFP 6 SP2. Я работаю в MSVC++.
Если дословно, то это "double-precision floating-point Julian day number calculated using Algorithm 199 from Collected Algorithms of the ACM". В общем, это double, содержащий количество дней с какой-то даты. Время определяется дробной частью в долях суток: 0,5 это 12 часов и т.д. Если из этого числа отнять 2415019 (получено экспериментально), то должно получиться OLE DateTime.
Здравствуйте Аноним, Вы писали:
А>Если дословно, то это "double-precision floating-point Julian day number calculated using Algorithm 199 from А>Collected Algorithms of the ACM". В общем, это double, содержащий количество дней с какой-то даты. Время определяется А>дробной частью в долях суток: 0,5 это 12 часов и т.д. Если из этого числа отнять 2415019 (получено экспериментально), А>то должно получиться OLE DateTime.
Читаю в буфер char* pBuff значение, потом отнимаю 241509 и преобразвываю в DATE, создаю COleDateTime из DATE, пытаюсь получит дату или время, возвращает полную ерунду. Опишите плиз поподробнее процедуру перевода в OLe DateTime или если можно приведите фрагмент кода.
Заранее спасибо
Здравствуйте Shad, Вы писали:
S>Читаю в буфер char* pBuff значение, потом отнимаю 241509 и преобразвываю в DATE, создаю COleDateTime из DATE, пытаюсь получит дату или время, возвращает полную ерунду. Опишите плиз поподробнее процедуру перевода в OLe DateTime или если можно приведите фрагмент кода. S> Заранее спасибо
А pBuff в double перед вычитанием преобразовывать пробовали?
S>>Читаю в буфер char* pBuff значение, потом отнимаю 241509 и преобразвываю в DATE, S>>создаю COleDateTime из DATE, пытаюсь получит дату или время, возвращает полную S>>ерунду. Опишите плиз поподробнее процедуру перевода в OLe DateTime или если можно S>>приведите фрагмент кода.
B>А pBuff в double перед вычитанием преобразовывать пробовали?
Кончено я его преобразовывал, как же иначе Тем неменее ничего не получается.
Еще раз прошу помощи.
Здравствуйте Shad, Вы писали:
S>Читаю в буфер char* pBuff значение, потом отнимаю 241509 и преобразвываю в DATE, создаю COleDateTime из DATE, пытаюсь получит дату или время, возвращает полную ерунду. Опишите плиз поподробнее процедуру перевода в OLe DateTime или если можно приведите фрагмент кода.
:shuffle: Забыл в прошлый раз зарегистрироваться...
Судя по описанию, все правильно. Может быть, дело в пропущенной единице? Должно быть 2415019.
char* buffer;
...
DATE date = *(double*)buffer - 2415019.0;
Здравствуйте Головлев Александр, Вы писали:
ГА> Забыл в прошлый раз зарегистрироваться... ГА>Судя по описанию, все правильно. Может быть, дело в пропущенной единице? Должно быть 2415019. ГА>
ГА>char* buffer;
ГА>...
ГА>DATE date = *(double*)buffer - 2415019.0;
ГА>
Я раскопал хелп от фокса 3.0 и прочитал там, что DateTime храниться в двух целых четырехбайтных числах первое число — дата, второе — время в миллисекундах от полуночи.
Попробовал извлечь время — все верно. Действительно получается правильное значение. Но опять же проблема с датой. Не понятно в каком формате это все хранится. Никаких ссылок в MSDN я на это дело не нашел.
В любом случае, спасибо что откликнулись и за совет.
Здравствуйте Shad, Вы писали:
S>Я раскопал хелп от фокса 3.0 и прочитал там, что DateTime храниться в двух целых четырехбайтных числах первое число — дата, второе — время в миллисекундах от полуночи.
Похоже, ошибочка вышла. Я имел дело с внутренним представлением DateTime через FoxAPI и был абсолютно уверен, что и в файле он хранится также. И зачем им это надо?
S>Попробовал извлечь время — все верно. Действительно получается правильное значение. Но опять же проблема с датой. Не понятно в каком формате это все хранится.
А вот с датой вроде все сходится. Я взял 4 байта как int, отнял 2415019 и если это привести к double, то получается DATE.