您好我需要在delphi中添加小时数,我有几个小时的数据以这种方式表达9:18:02,8:15:19,9:22:13我需要知道这些小时的总数,例如,这三个数据总共为26:55:34。这个想法是知道用户花费的小时数。谢谢你的帮助。
答案 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的评论中所提到的,StrToTime和TryStrToTime的重载版本处理时间字符串的特定区域转换,并消除了可能的线程更改应用程序转换设置的影响。在上面的链接中阅读文档中有关TFormatSettings的内容。
实际代码也应该处理可能的转换错误。
答案 1 :(得分:2)
这是一本关于如何自行实现的基本指南:
:
上的字符串以获得三个字符串,小时,分钟,秒。StrToInt
将这三个值转换为整数。div
和mod
。Format
重新构建包含最终答案的字符串。换句话说,您将时间跨度转换为秒,将其添加,然后转换回小时,分钟和秒。这里涉及的算法非常基础。
但是,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;