В БД одной из программ, с которой мне довелось столкнуться, дата записывалась числом в следующем формате 42004.9492447917
.
Сначала я немного не понял, потом поискал в интернете и всё понял.
В общем, это запись даты в формате OLE (так называемый OLE Automation Date или дата с плавающей точкой).
Логика переформатирования в обычную дату следующая:
число до запятой — количество дней, прошедших с полуночи 30 декабря 1899 года
число после запятой — часть дня, которая прошла с его начала. То есть если в сутках у нас 86400 секунд, то полдень будет выражен числом 0.5, как-то так.
То есть, если нам нужно перекодировать число 42004.9492447917 в обычную дату, считаем, то получаем следующее:
42004 — это 42004-й день с 30 декабря 1899 года, то есть 01 января 2015 года
0.9492447917 — это количество секунд, которое прошло с 00:00 этого же дня, разделенное на общее количество секунд в сутках, то есть 0.9492447917*86400 = 82014 секунды, то есть 22 часа 46 минут 54 секунды.
В итоге получаем дату: 01.01.2015 22:46:54
Написал пару небольших функций на RUby для конвертирования дат из одного формата в другой.
Для начала, конечно же, запросим require 'time'
Из OLE в стандартный формат:
def convert_time(t)
puts Time.at((time.to_f - 25569) * 86400).utc
end
utc в конце необходим для того, чтобы вам выдалось время без поправки на вашу таймзону.
time.to_f
— конвертируем входные данные в float
(time.to_f - 25569)
— делаем началом отсчета 1 января 1970 года
((time.to_f - 25569) * 86400)
— конвертируем дату в Unix time
Из стандартной даты в OLE:
def to_ole(t)
Time.parse(t).to_f/86400 + 25569
end
Здесь изначально дата должна быть в любом подходящем формате и обязательно с указанием UTC, иначе скрипт будет прибавлять или отнимать к нужному времени количество часов для подгонки под локальное время.
Собственно всё.