(0) Пожалуйста, уточните «как 12 марта 2007 года или аналогичный»: вы имеете в виду, что вы ожидаете, что 11-значное число int преобразуется в 12 марта 2007 года, или «12 марта 2007 года» просто предназначено для передачи формата, в котором Вы хотите отобразить дату? Если последнее, разве вы не можете предоставить ожидаемые результаты, проверяя некоторые файлы с помощью MS Word или гаджета для обработки текста OpenOffice.org? Как вы собираетесь проверить, что любое предлагаемое решение действительно работает?
(1) Пожалуйста, дайте более одной (OLE, ожидаемой) пары, чтобы правильная работа любого предложенного решения могла быть проверена с большей уверенностью. Если возможно, можете ли вы создать примеры с известными ожидаемыми значениями, такими как 01 января 2000 года, 01 января 2001 года, 02 января 2001 года, 02 февраля 2001 года?
(2) Из "извлечения данных из потоков OLE" неясно, хотите ли вы, чтобы временные метки создавались и т. Д. В заголовке составного документа OLE2, или вам нужны временные метки, которые присутствуют в содержимом. Скажите, пожалуйста, ГДЕ вы тралите из-за временных отметок. Это также очень помогло бы, если бы вы могли дать ссылку на документацию MS, относящуюся к интересующим вас временным меткам ... несомненно, она должна указывать вам, что это за формат, даже если он делает это косвенно одним или двумя внутренними / дополнительными документ хмеля.
(3) Покажите, пожалуйста, КАК вы это вытаскиваете - это струна? исправлено 11 байт? Или это str (какой-то int, который вы преобразовали из 64-битного поля)? Преобразован КАК ?? А также описание, покажи свой код конверсии. Не перепечатывайте свой код из памяти; используйте копирование / вставку.
Пожалуйста, предоставьте запрашиваемую информацию, отредактировав свой вопрос, а не комментарии.
Обновление в ожидании информации:
Временные метки создания и изменения файлов в заголовке составного документа OLE представляют собой 64-разрядные целые числа с прямым порядком байтов, представляющие (секунды с 1601-01-01T00: 00: 00) * 10 ** 7.
Тип DATE, используемый в данных в данных OLE2, представляет собой 64-битную переменную IEEE 754 с прямым порядком байтов, представляющую (дни и их часть) с 1899-12-30T00: 00: 00. Да, день 30, а не 31.
Обновление после изучения 2 предоставленных примеров:
Разница между двумя наблюдаемыми метками времени (которые будут в вашем местном времени) составляет 325920 секунд:
>>> import datetime
>>> t0 = datetime.datetime(2009,10,27,15,33,0)
>>> t1 = datetime.datetime(2009,10,31,10,5,0)
>>> t1-t0
datetime.timedelta(3, 66720)
>>> secs = 3 * 24 * 60 * 60 + 66720
>>> secs
325920
Это то же самое, что и разница между двумя магическими числами:
>>> 12901417500 - 1290191580
325920
Итак, магические числа представляют секунды с некоторой эпохи ...
>>> m1 = 12901417500
>>> days, seconds = divmod(m1, 60*60*24)
>>> epoch = t1 - datetime.timedelta(days, seconds)
>>> epoch
datetime.datetime(1601, 1, 1, 11, 0)
Таким образом, магические числа представляют секунды с 1601-01-01T00: 00: 00Z, а ваш TZ находится в 11 часах от UTC.
Эти два магических числа не уместятся в 32 бита ... похоже, либо (а) они хранятся в 64-битных секундах с 1601 года (потеря примерно 29 бит!), Либо (б) они сохраняются как (количество единиц по 100 наносекунд) с 1601 года, как и ожидалось, но что-то делит его на 10 ** 7, прежде чем вы увидите это.
Ссылка на документацию, которую вы дали, просто говорит, что это тип VF_FILETIME (UTC)
. Погуглив это, я обнаружил пару подсказок MS о том, как вызывать функции Windows для манипулирования временными метками, но, насколько я понял, определения нет. Однако есть две сторонние заметки (от perlmonks и проекта Apache POI), в которых говорится одно и то же: "" "Это похоже на тип данных Windows VT_FILETIME
, представляющий собой 64-битное целое число без знака, представляющее количество прошедших 100 наносекунд с 1 января 1601 года "" "
Обновление с места преступления:
Кажется, вы используете OleFileIO_PL
для чтения файлов. Быстрое копание в единственном исходном файле показывает следующее:
elif type == VT_FILETIME:
value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32)
# FIXME: this is a 64-bit int: "number of 100ns periods
# since Jan 1,1601". Should map this to Python time
value = value / 10000000L # seconds