【问题标题】:Convert Extended to Time将扩展转换为时间
【发布时间】:2015-09-09 12:13:16
【问题描述】:

我需要将扩展​​值转换为时间格式。例如:

3.50 represents  00:03:50
62.02 represents 01:02:02
73.70 represents 01:14:10

我尝试了以下函数来转换小时和分钟部分,但我不知道如何转换秒部分。

function ConvertToTime(AValue: Extended): TDateTime;
begin
    Result:=  EncodeTime(trunc(ArticleRec.Quantity) div 60,trunc(ArticleRec.Quantity) mod 60,0,0);
end;

期待您的帮助。

【问题讨论】:

  • 如果您要使用持续时间(而不是一天中的时间),那么您可以使用 TTimeSpan 记录(如果您仍在使用 Delphi XE2)而不是 @987654325 @ 数据类型(因为您不能轻易地表示超过 24 小时的值)。例如TTimeSpan.FromMinutes 函数可以为您提供格式中的时间跨度记录。
  • 好的,是的,我正在使用 XE2。谢谢,我会试试 TTimeSpan。
  • 再次感谢 David Heffernan 和 TLama 提供的解决方案。我使用 David Heffernan 的函数将 double 值转换为 seconds ,之后我使用 TTimeSpan.FromSeconds 并将 TimeSpan 格式化为 HH:MM:SS 持续时间:1.Total := TTimeSpan.FromSeconds(ConvertWeirdTimeFormatToSeconds(62.02)) 2 .format('%2d:%.2d:%.2d', [Total.days * 24 + Total.Hours, Total.Minutes,Total.Seconds])

标签: delphi


【解决方案1】:

小数部分是这样获得的:

var
  SecondsFrac: Double;
....
SecondsFrac := Frac(Value);

然后您可以将 0 到 1 范围内的浮点小数值转换为 0 到 100 范围内的整数,如下所示:

var
  Seconds: Integer;
....
Seconds := Round(SecondsFrac*100);

不过,这是一种非常奇怪的存储时间的方式。您必须处理这样一个事实:当Seconds >= 60 时,您需要增加分钟数,并将Seconds 减少60

我想我会通过将时间转换为秒来做到这一点,然后从那里开始:

function ConvertWeirdTimeFormatToSeconds(const Value: Double): Integer;
var
  SecondsFrac: Double;
begin
  SecondsFrac := Frac(Value);
  Result := Round(SecondsFrac*100) + Trunc(Value)*60;
end;

然后您可以将秒数解码为不同的部分,如下所示:

procedure DecodeSeconds(Value: Integer; out Hours, Minutes, Seconds: Integer);
begin
  Seconds := Value mod 60;
  Value := Value div 60;
  Minutes := Value mod 60;
  Value := Value div 60;
  Hours := Value;
end;

这让我觉得将时间存储在从午夜开始的整数秒中可能会更好。在我看来,使用标准格式更有意义。

我认为没有理由在这里使用Extended,或者实际上在任何地方使用。它是一种非标准类型,由于其奇怪的大小和随之而来的对齐问题,往往表现不佳。并且它仅在 x86 上受支持。

【讨论】:

  • 感谢您的帮助。您建议我使用哪种标准格式?
  • 这取决于你的目标是什么。我不知道你的动机是什么。
  • 根据规范,时间延长。之前我只为几小时和几分钟的转换提供服务,现在我也需要为第二部分提供服务。有没有其他更简单的方法来表示第二部分的数字。
  • 将其存储为Seconds / 60 是一种选择。然而,使用Extended 肯定是一个糟糕的设计选择。很多人并不真正了解Extended 的缺点,并认为实际上不存在的好处。谁做出了这样的选择?
  • 时间跨度与时间不同。不管怎样,我想我回答了你问的问题。
猜你喜欢
  • 2015-06-06
  • 2017-08-13
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2019-09-09
相关资源
最近更新 更多