Конференция "Прочее" » Формат хранения времени в файле [D3, Win2k, WinXP]
 
  • igan © (24.12.08 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 © (24.12.08 11:23) [1]
    табличка кривовато получилась :(
  • Jeer © (24.12.08 11:36) [2]

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


    А программистов спросить ?
  • igan © (24.12.08 12:38) [3]
    они все давно "умерли". компании этой практически нет, и жили они в городе Демойн, штат Айова, ЮСА, так что проблематично
  • Сергей М. © (24.12.08 12:52) [4]

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


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

    Где тут эти самые "следующие 12 байт" ?
  • igan © (24.12.08 13:17) [5]
    левый столбик - порядковый номер байта (байты с 12 по 23), столбцы - 4 разных файла для сравнения.
    Собственно, я особо и надеялся на помощь :(
  • icWasya © (24.12.08 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
  • Дуб © (24.12.08 13:26) [7]
    > igan ©   (24.12.08 13:17) [5]

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

    494735D0 - 1229403600 - это 38 лет примерно - как раз 2008.
  • igan © (24.12.08 14:49) [8]
    Спасибо, ребята! Сам только что догадался, хотел написать :)
    Спасибо, спасибо! Осталось совсем немного! Но уже завтра! :)
  • igan © (25.12.08 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 © (25.12.08 08:51) [10]
    DateUtils.UnixToDateTime
  • Дуб © (25.12.08 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 © (25.12.08 09:03) [12]
    Ого! Правда, в D3 нет такого, но ничего, нашел в D6. Спасибо!
  • igan © (25.12.08 09:05) [13]
    Еще раз спасибо! :)
 
Конференция "Прочее" » Формат хранения времени в файле [D3, Win2k, WinXP]
Есть новые Нет новых   [134449   +17][b:0][p:0.002]