Delphi 将扩展值转换为时间

Delphi 将扩展值转换为时间,delphi,floating-point,extended-precision,Delphi,Floating Point,Extended Precision,我想将扩展值转换为时间。 在小数点分隔符为小时之前 小数点后的分隔符是分钟数字 8,62944444444444 --> 8:37 1,41666666666667 --> 1:25 我已经做了这个功能,但我得到的是1416667-->1:24 必须是25分钟 function MyConvertion(AValue: Extended): TDateTime; var Hour, Min, Sec, MSec: Word; begin Hour:= Trunc(A

我想将扩展值转换为时间。 在小数点分隔符为小时之前 小数点后的分隔符是分钟数字

8,62944444444444  --> 8:37
1,41666666666667  --> 1:25
我已经做了这个功能,但我得到的是1416667-->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;
当我使用精确的141666667时,我得到1:25 但是我必须转换的值来自soap enterface,它是double(oPostCalculationDay.DirectAssignedWorkTime)

我在调试模式下得到的值=1416667

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
我在想


但是我必须用的最好的方法是什么?Roundto-14,因为1416667是其他分隔符后面的14个数字?

我的假设是这些值的编码如下:

Hours + Minutes/60 
其中,
Hours
Minutes
是整数,
Minutes
介于0和59之间(包括0和59)

您需要将分钟四舍五入,而不是截断它们

Min := Round(Frac(AValue)*60);
如果分数部分包含秒甚至毫秒,则需要进行不同的计算

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


我不认为在这里使用extended有什么意义。在x86上,该类型只存在于与double不同的地方,而且由于对齐不良,它在任何情况下都比double慢,并且在这里没有从double获得的任何东西

这就是我将使用
TTimeSpan.frommines()
的地方。我在这里看不到
TDateTime
的位置。@TLama感谢它与System.TimeSpan.TTimeSpan一起工作。FromHours@Ravaut请不要回答这个问题。我回复道,141666667给我1:25,862944444给我8:38。解决方案是,从TLamaI得到的数据将四舍五入到毫秒。很可能1:24:59应该显示为1:24。@LURD这个问题向我建议,小时和分钟是用小时+分钟/608629944444是8:37:46编码的。@LURD在调试时得到8629444,但它不止这些。
MSecs := Round(Frac(AValue)*3600000);