Извиняюсь, совсем забыл про такую функцию, да и не удивительно, я ею не пользуюсь, вообще ненужная функция, обычно отбрасывают часть или округляют чтобы получить целое число, а эта функция вернет целое число, но в формате вещественного, если нужно вещественное число, то IntToFloat никто не отменял... ну да ладно.
насчет главного вопроса, пока сделал простым делением, но хотелось бы все таки понять, почему не работает этот вариант перевода. Кстати пробовал также написать более грамотно, борясь с возможными лагами и т.д., но главный баг (а может это и не баг) так и остался, вот доработанный код:
Код:

function ConvertTime(timeExt: Extended):string;
var m, w, d, h, min, sec: Int64;
begin
m := Trunc(Convert(timeExt, tuSeconds, tuMonths));
timeExt := timeExt - Trunc(Convert(m, tuMonths, tuSeconds));
w := Trunc(Convert(timeExt, tuSeconds, tuWeeks));
timeExt := timeExt - Trunc(Convert(w, tuWeeks, tuSeconds));
d := Trunc(Convert(timeExt, tuSeconds, tuDays));
timeExt := timeExt - Trunc(Convert(d, tuDays, tuSeconds));
h := Trunc(Convert(timeExt, tuSeconds, tuHours));
timeExt := timeExt - Trunc(Convert(h, tuHours, tuSeconds));
min := Trunc(Convert(timeExt, tuSeconds, tuMinutes));
sec := timeExt - Trunc(Convert(min, tuMinutes, tuSeconds));
if m <> 0 then Result := IntToStr(m) + ' мес ';
if w <> 0 then Result := Result + IntToStr(w) + ' нед ';
if d <> 0 then Result := Result + IntToStr(d) + ' д ';
if h <> 0 then Result := Result + IntToStr(h) + ' ч ';
if min <> 0 then Result := Result + IntToStr(min) + ' м ';
if sec <> 0 then Result := Result + IntToStr(sec) + ' с ';
if (m = 0) and (w = 0) and (d = 0) and (h = 0) and (min = 0) and (sec = 0)
then Result := '0 c';
end;