2015-04-01 3 views
2

Я хочу преобразовать увеличенное значение во времени. до DecimalSeparator это часы после DecimalSeparator являются минутами цифровыхПреобразовать увеличенное значение во Время

8,62944444444444 --> 8:37 
1,41666666666667 --> 1:25 

Я сделал это Funtion, но я для 1,41666666666667 -> 1:24 Это должно быть 25 минут

function MyConvertion(AValue: Extended): TDateTime; 
var 
    Hour, Min, Sec, MSec: Word; 
begin 
    Hour:= Trunc(AValue); 
    Min:= Trunc(Frac(AValue)*60); 
    result:= EncodeTime(Hour, Min, 0, 0); 
end; 

Когда я использую точные 1,41666666666667, я получаю 1:25 Но значение, которое я должен преобразовать, выводится из мыльного входа как double (oPostCalculationDay.DirectAssignedWorkTime).

Значение я получаю в режиме отладки = 1,41666666666667

MyConvertion(1,41666666666667) --> 1:25 
MyConvertion(oPostCalculationDay.DirectAssignedWorkTime) --> 1:24 
MyConvertion(RoundTo(oPostCalculationDay.DirectAssignedWorkTime, -15)) --> 1:25 
MyConvertion(RoundTo(oPostCalculationDay.DirectAssignedWorkTime, -16)) --> 1:24 
MyConvertion(strtofloat(floattostr(oPostCalculationDay.DirectAssignedWorkTime)))--> 1:25 

Я думаю, это что-то вроде Floating points

Но что это лучший Methode я должен использовать? Roundto -14, потому что 1,41666666666667 - это 14 чисел после разделителя чего-то еще?

+1

Вот где я буду использовать 'TTimeSpan.FromMinutes()'. Здесь я не вижу места для TDateTime. – TLama

+0

@TLama благодарит его за работу с System.TimeSpan.TTimeSpan.FromHours – Ravaut123

+0

@Ravaut Пожалуйста, не отвечайте на вопрос. Я вернулся. –

ответ

2

Мое предположение, что значения кодируются следующим образом:

Hours + Minutes/60 

где Hours и Minutes целые и Minutes между 0 и 59 включительно.

Вам нужно округлить минут, а не укоротить их

Min := Round(Frac(AValue)*60); 

Если дробная часть содержит секунды или даже миллисекунды, то вам нужен другой расчет.

Secs := Round(Frac(AValue)*3600); 

или

MSecs := Round(Frac(AValue)*3600000); 

Я не вижу особого смысла в использовании продлен здесь. Этот тип существует только от double на x86 и в любом случае медленнее, чем двойной из-за плохого выравнивания, и не дает вам ничего здесь, что вы не можете получить из double.

+0

Это дает мне 1:25 для 1,41666666666667, но 8:38 для 8,62944444444444. Решение это от TLama – Ravaut123

+0

Я бы округлялся до миллисекунд. Вероятно, 1:24:59 должно отображаться как 1:24. –

+0

@ LURD вопрос подсказывает мне, что часы и минуты были закодированы с использованием часов + минут/60 –

 Смежные вопросы

  • Нет связанных вопросов^_^