Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];

Вниз

Формат хранения времени в файле   Найти похожие ветки 

 
igan ©   (2008-12-24 11:22) [0]

Добрый день!
 Из хелпа известно, что в делфи (а также по стандарту OLE Automation) дата/время хранится в формате вещ. числа, где целая часть - это кол-во дней с 30.12.1899 года, а дробная - время с начала дня.
 "The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is the time of day"

 Я пытаюсь прочитать время из файла, в которм хранится история процесса. Проблема в том, что программисты решили сохранять время в каком то "своем" формате. Пока я не могу определить каким образом декодировать время, поэтому прошу вашей помощи.

 Исходные данные:
переписал из 4-х файлов байты, отвечающие за время:


16.12.2008 20.12.2008 22.12.2008 24.12.2008    
     
Все данные о времени находятся в следующих 12 байтах:

addr Похоже что это время/дата окончания записи
12 FC  FC  E4  5A
13 36  7C  20  AE
14 47  4C  4F  51
15 49  49  49  49

Похоже что это время в миллисекундах
16 32  E6  64  76
17 25  88  35  44
18 3E  D7  81  2F
19 26  3A  00  00

Похоже что это время/дата начала записи
20 D0  D0  D0  B0
21 35  7B  1E  A5
22 47  4C  4F  51
23 49  49  49  49

из файла от 22.12.2008

10:08:52.000 - 64 35 81 00 первая запись
...
10:11:50.000 - B4 EC 83 00
10:11:52.000 - 84 F4 83 00
10:11:54.000 - 54 FC 83 00 последняя запись


 Бросается в глаза, что разнице в 2 дня соответствует разница примерно на 2 в байтах 14 и 22, так же заметно, что байты с 16 по 19 это время в мсек.
 Возможно, что байты 12 и 20 не имеют прмого отношения к вопросу.
 Вот собственно все. Очень надеюсь на вашу помощь.


 
igan ©   (2008-12-24 11:23) [1]

табличка кривовато получилась :(


 
Jeer ©   (2008-12-24 11:36) [2]


> Проблема в том, что программисты решили сохранять время
> в каком то "своем" формате


А программистов спросить ?


 
igan ©   (2008-12-24 12:38) [3]

они все давно "умерли". компании этой практически нет, и жили они в городе Демойн, штат Айова, ЮСА, так что проблематично


 
Сергей М. ©   (2008-12-24 12:52) [4]


> Все данные о времени находятся в следующих 12 байтах


Ничего не понятно ..

Где тут эти самые "следующие 12 байт" ?


 
igan ©   (2008-12-24 13:17) [5]

левый столбик - порядковый номер байта (байты с 12 по 23), столбцы - 4 разных файла для сравнения.
Собственно, я особо и надеялся на помощь :(


 
icWasya ©   (2008-12-24 13:23) [6]

вот первая группа, снизу вверх

49 47 36 FC - 16 дек 2008 05:05:00.000
49 47 7C FC - 16 дек 2008 10:03:40.000
49 4F 20 E4 - 22 дек 2008 05:08:52.000
49 51 AE 5A - 24 дек 2008 03:36:58.000

если это так - то там число секунд от 1.1.1970 - CDate


 
Дуб ©   (2008-12-24 13:26) [7]

> igan ©   (24.12.08 13:17) [5]

С 1970 года попробуй оттолкнуться и не в миллисекундах, а в секундах.

494735D0 - 1229403600 - это 38 лет примерно - как раз 2008.


 
igan ©   (2008-12-24 14:49) [8]

Спасибо, ребята! Сам только что догадался, хотел написать :)
Спасибо, спасибо! Осталось совсем немного! Но уже завтра! :)


 
igan ©   (2008-12-25 07:34) [9]

> icWasya

А как ты считал, какой функцией? не на калькуляторе же :)

итак:
1) байты с 12 по 15 - это время начала записи, в секундах, с 1.1.1970
но! реально время в первых двух файлах примерно 00:05:00, в 3-м и 4-м около 14 часов.
2) байты с 16 по 19 - это, видимо, дополнительное смещение в мсек.
10:11:50.000 - B4 EC 83 00
10:11:52.000 - 84 F4 83 00
10:11:54.000 - 54 FC 83 00
только непонятно, почему не с 0 начинается счет.

3) байты с 20 по 23 - должно быть время окончания записи. (аналогично 1 пункту)

Если все это так, дело осталось за методом перевода из "секунд с 1.1.1970" в нормальную дату. icWasya, как ты переводил?
Спасибо за помощь!!!


 
MBo ©   (2008-12-25 08:51) [10]

DateUtils.UnixToDateTime


 
Дуб ©   (2008-12-25 08:59) [11]

>igan ©   (25.12.08 07:34) [9]

Это Юниксэпох все. Смотри их форматы.


microtime
(PHP 3 <= 3.0.18, PHP 4 >= 4.0.0)

microtime --  Return current UNIX timestamp with microseconds
Description

string microtime (void)

Returns the string "msec sec" where sec is the current time measured in the number of seconds since the Unix Epoch (0:00:00 January 1, 1970 GMT), and msec is the microseconds part. This function is only available on operating systems that support the gettimeofday() system call.

Both portions of the string are returned in units of seconds.


 
igan ©   (2008-12-25 09:03) [12]

Ого! Правда, в D3 нет такого, но ничего, нашел в D6. Спасибо!


 
igan ©   (2008-12-25 09:05) [13]

Еще раз спасибо! :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1231532495
Б
2009-01-09 23:21
2009.02.22
TList


2-1231570514
RUBEY
2009-01-10 09:55
2009.02.22
Прием параметров через командную строку


15-1230090393
Slider007
2008-12-24 06:46
2009.02.22
С днем рождения ! 24 декабря 2008 среда


2-1231824561
r900000
2009-01-13 08:29
2009.02.22
Работа с Мемо компонентами


4-1206106972
chak_xakep
2008-03-21 16:42
2009.02.22
Как на Delphi посредством WIN32API создать MainMenu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский