Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Подскажите формат DateTime (в файле DBF)  [new]
redex
Member

Откуда: Уфа
Сообщений: 26
Доброго времени суток.
Подскажите, если кто знает, как из 8 байт (например, 9E 71 25 00 D8 33 1C 01), содержащих значение типа T (DateTime), получить дату и время.
Если не ошибаюсь, то каждый байт содержит кол-во дней (дата) и миллисекунд (время), прошедшее с 1 января какого-то года (возможно, 100 г.), однако все попытки приведения пока результата не дали.
Заранее спасибо.
17 авг 06, 22:32    [3019935]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите формат DateTime (в файле DBF)  [new]
luzzeerr
Member

Откуда:
Сообщений: 67
Еще бы знать адрес в файле где ты это добро видишь Было бы забиц! Тут же тебе не телепаты, екарный бабай. Но уж если дело пошло на счет заголовчной информации, то блин, набери в поиске "обратная интеловская запись"и переведи из 16 в 10. Это что? счас не учат в институтах ?
17 авг 06, 23:57    [3020120]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите формат DateTime (в файле DBF)  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Формат хранения типа DateTime

FoxPro

8 байт

Первые 4 байта - количество дней по Юлианскому исчислению (функция SYS(11, DateTime()))
Следующие 4 байта - количество миллисекунд с полуночи с точностью до 333 миллисекунд

Юлианский период это промежуток времени в 7980 лет, используемый в астрономических и хронологических расчетах. Благодаря этому длительность того или иного астрономического или исторического события, выраженная в сутках, может быть определена путем простого вычитания номеров дней, сответствующих концу и началу события.

Начала юлианского периода = 1 января 4713год до н.э.

MS SQL

при конвертации в Double

Целая часть - количество дней от 01.01.1900
Дробная часть - отношение количества миллисекунд прошедших с полуночи на количество миллисекунд в сутках (86400000) с точностью до 3.33 миллисекунд (в 100 раз точнее, чем в FoxPro)

Excel

при конвертации в Double

Целая часть - количество дней от 31.12.1900
Дробная часть - отношение количества миллисекунд прошедших с полуночи на количество миллисекунд в сутках (86400000). Точность неизвестна!

=================

Все числа, записаны справа-налево. Т.е. переводятся в обратном последовательности. Разбиваем одно 8 битовое число на два 4-х битовых и каждое читаем справа-налево как множитель степени числа 256 (1 байт = 2**8 = 256)

Дата = 9E 71 25 00 = ;
0h00 * 256**3 + 0h25 * 256**2 + 0h71 * 256**1 + 0h9E * 256**0 =;
0 * 16777216 + 37 * 65536 + 113 * 256 + 158 * 1 = ;
2453918

?SYS(10,2453918) = 01.07.2006

Время = D8 33 1C 01 = ;
0h01 * 256**3 + 0h1C * 256**2 + 0h33 * 256**1 + 0hD8 * 256**0 =;
1*16777216 + 28 * 65536 + 51 * 256 + 216 * 1 = ;
18625496

18625496 миллисекунд = 05:10:25.496
18 авг 06, 00:31    [3020207]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите формат DateTime (в файле DBF)  [new]
redex
Member

Откуда: Уфа
Сообщений: 26
luzzeerr
Еще бы знать адрес в файле где ты это добро видишь

Это соверешенно неважно. Где-то в данных, начиная со смещения, лежащего в байтах 8-9 с начала файла. Про порядок байт я в курсе, но за напоминание спасибо :) А в универах уже давно ничему хорошему не учат.

Проблема была именно в интерпертации данных. Нигде не нашел ничего стоящего, даже на сайте мелкомягких.

ВладимирМ
Первые 4 байта - количество дней по Юлианскому исчислению

Огромный респект! Проблемы это полностью не решило (т.к. я пишу на С++, где ф-ии, аналогичной SYS, к сожалению, нет). Но конвертацию я-таки сделал. Спасибо.
18 авг 06, 12:10    [3022169]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить