如何使用Delphi汇总小时数?

时间:2014-09-11 06:24:27

标签: delphi sum

您好我需要在delphi中添加小时数,我有几个小时的数据以这种方式表达9:18:02,8:15:19,9:22:13我需要知道这些小时的总数,例如,这三个数据总共为26:55:34。这个想法是知道用户花费的小时数。谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

如果您想要whole小时:

var 
  totalHours: Integer;
...
totalHours := HoursBetween(0,StrToTime(s1) + StrToTime(s2) + StrToTime(s3));

如果您想要fractional小时:

var
  fracHours: Double;
...
fracHours := HourSpan(0,StrToTime(s1) + StrToTime(s2) + StrToTime(s3));

其中s1,s2,s3是表示为字符串的时间值。

注意,在处理日期,时间值时,请查看RTL提供的内容:Date and Time Support


正如mg30rg的评论中所提到的,StrToTimeTryStrToTime的重载版本处理时间字符串的特定区域转换,并消除了可能的线程更改应用程序转换设置的影响。在上面的链接中阅读文档中有关TFormatSettings的内容。

实际代码也应该处理可能的转换错误。

答案 1 :(得分:2)

这是一本关于如何自行实现的基本指南:

  1. 拆分:上的字符串以获得三个字符串,小时,分钟,秒。
  2. 使用StrToInt将这三个值转换为整数。
  3. 使用一分钟60秒和一小时60分钟将持续时间转换为秒的事实。
  4. 总结价值。
  5. 将秒除以60.余数是最终秒数,除法的结果是总分钟数。使用divmod
  6. 将上一步计算的总分钟数除以60.余数为分钟数,除法结果为小时数。
  7. 使用Format重新构建包含最终答案的字符串。
  8. 换句话说,您将时间跨度转换为秒,将其添加,然后转换回小时,分钟和秒。这里涉及的算法非常基础。


    但是,System.TimeSpan单位已经满足您的需求。

    {$APPTYPE CONSOLE}
    
    uses
      System.SysUtils,
      System.TimeSpan;
    
    var
      Total: TTimeSpan;
    
    begin
      Total := TTimeSpan.Parse('9:18:02') + TTimeSpan.Parse('8:15:19') +
        TTimeSpan.Parse('9:22:13');
      Writeln(Format('%d:%.2d:%.2d', [Total.Days * 24 + Total.Hours, Total.Minutes,
        Total.Seconds]));
    end.
    

    <强>输出:

    26:55:34
    

    我认为这有点混乱,你需要把日子转换成几小时,但这不应该太困难。

答案 2 :(得分:1)

Delphi中没有任何内容可以为您提供所需的结果。

我已经给你写了一个小课程给你打勾:

unit HourU;

interface

{$M+}
uses
  SysUtils;

const
  TimeSeparatorUsed: Char = ':';

Type
  THour = record
  private
    FHours: Word;
    FMinutes: Word;
    FSeconds: Word;
  public
    constructor Create(aDateTime: TDateTime);
    function ToString: String;
    function ToLongString: String;
    property Hours: Word read FHours;
    property Minutes: Word read FMinutes;
    property Seconds: Word read FSeconds;
  end;

  THourCalculator = class
  private
    FTotalHours: Double;
    FFormatSettings: TFormatSettings;
    function GetTotalHours: THour;
  public
    constructor Create;
    function Add(const Value: Double): THourCalculator; overload;
    function Add(const Value: String): THourCalculator; overload;
    property TotalHours: THour read GetTotalHours;
  end;

implementation

{ THourCalculator }

constructor THourCalculator.Create;
begin
  inherited;
  FTotalHours := 0;
  FFormatSettings := TFormatSettings.Create;
  FFormatSettings.TimeSeparator := TimeSeparatorUsed;
end;

function THourCalculator.GetTotalHours: THour;
begin
  Result := THour.Create(FTotalHours);
end;

function THourCalculator.Add(const Value: String): THourCalculator;
var
  Time: TDateTime;
begin
  if TryStrToTime(Value, Time, FFormatSettings) then
    Add(Time);
  Result := Self;
end;

function THourCalculator.Add(const Value: Double): THourCalculator;
begin
  FTotalHours := FTotalHours + Value;
  Result := Self;
end;

{ THour }

constructor THour.Create(aDateTime: TDateTime);
var
  Value: TDateTime;
  MSec: Word;
begin
  Value := aDateTime - Trunc(aDateTime);
  DecodeTime(Value, FHours, FMinutes, FSeconds, MSec);
  inc(FHours, Trunc(aDateTime) * HoursPerDay);
end;

function THour.ToLongString: String;
begin
  Result := Format('%d Hours, %d Minutes and %d Seconds', [FHours, FMinutes, FSeconds]);
end;

function THour.ToString: String;
begin
  Result := Format('%d%1:s%d%1:s%d', [FHours, TimeSeparatorUsed, FMinutes, FSeconds]);
end;

end.

首先保存单位,然后将其添加到使用中。

然后是一个如何使用它的例子:

uses
  HourU;

procedure TForm2.Button1Click(Sender: TObject);
var
  HourCalculator: THourCalculator;
  Hour: THour;
begin
  HourCalculator := THourCalculator.Create;
  Hour := HourCalculator.Add('9:18:02').Add('8:15:19').Add('9:22:13').TotalHours;
  ShowMessage(Hour.ToString);
  ShowMessage(Hour.ToLongString);
  FreeAndNil(HourCalculator);
end;

答案 3 :(得分:0)

这是使用TTimeSpan的另一个版本

uses
  Timespan;

type
  TTimeSpanHelper = record helper for TTimeSpan
  private
    function TotalHours: Integer;
  public
    function sAdd(const Value: String): TTimeSpan;
    function ToString: String;
    function ToLongString: String;
  end;


{ TTimeSpanHelper }

function TTimeSpanHelper.sAdd(const Value: String): TTimeSpan;
begin
  Result := Add(TTimeSpan.Parse(Value));
end;

function TTimeSpanHelper.ToLongString: String;
begin
  Result := Format('%d:%d:%d', [TotalHours, Minutes, Seconds]);
end;

function TTimeSpanHelper.ToString: String;
begin
  Result := Format('%d Hours, %d Minutes and %d Seconds', [TotalHours, Minutes, Seconds]);
end;

function TTimeSpanHelper.TotalHours: Integer;
begin
  Result := Days * HoursPerDay + Hours;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
  HourCalculation: TTimeSpan;
begin
  HourCalculation := TTimeSpan.Parse('9:18:02').sAdd('8:15:19').sAdd('9:22:13');
  ShowMessage(HourCalculation.ToString);
  ShowMessage(HourCalculation.ToLongString);
end;