有人可以告诉我关于将持续时间格式化为HH:MM:SS的最佳方式转换为秒或分钟吗?
即。 00:01:49 = 109secs
我正在使用此代码但无法正常工作
var
i: real;
j: integer;
begin
i := frac(real(StrToTime('00:00:01')));
j := trunc(frac(real(StrToTime('01:00:00'))) / i );
memo2.lines.add(inttostr(j));
当我用00:10:00尝试代码时返回599
感谢
答案 0 :(得分:5)
用于处理持续时间的非常灵活的工具是单位System.TimeSpan中的TTimeSpan
。您可以使用不同的单位(秒,分钟,小时......)获得结果,并根据您的需要进行格式化。
var
timeSpan: TTimeSpan;
begin
timeSpan := TTimeSpan.Parse('00:01:49');
memo2.lines.add(Format('%1.1f min', [timeSpan.TotalMinutes]));
end;
答案 1 :(得分:5)
使用DateUtils
单位:
WriteLn(SecondOfTheDay(StrToTime('00:10:00')));
WriteLn(MinuteOfTheDay(StrToTime('00:10:00')));
输出:
600
10
您的代码无法正常工作的原因是浮点值通常无法准确表示。要避免有关TDateTime
如何表示时间的所有实现细节,请使用SysUtils和DateUtils中的内置函数,请参阅Date and Time Support。
答案 2 :(得分:3)
使用DecodeTime:
http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.DecodeTime
所以你的代码应该是这样的:
DecodeTime(StrToTime('00:00:01'), Hour, Min, Sec, MSec);
返回秒的函数应如下所示:
function GetSeconds(ATimeString: string): Integer;
var
Hour, Min, Sec, MSec: Word;
begin
DecodeTime(StrToTime(ATimeString), Hour, Min, Sec, MSec);
Result := Hour * 3600 + Min * 60 + Sec;
end;
答案 3 :(得分:0)
这不是一个独立的答案,而只是对Uwe答案的扩展。支持他的答案。
//Iterate until the transfer was completed succesfully
while(!transfer_success)
{
while(SD_menu_select());
//2 data bytes are to be expected
//Store data in temporary register
while(!(USART2->ISR & USART_FLAG_RXNE));
temp_data[0] = (uint8_t)(USART2->RDR & (uint16_t)0x01FF);
//char urt_buf_t[30];
/*lcd_write_cmd(1);
sprintf(urt_buf_t, "UART:%X", temp_data[0]);
lcd_str_XY(0,0, urt_buf_t);*/
while(!(USART2->ISR & USART_FLAG_RXNE));
temp_data[1] = (uint8_t)(USART2->RDR & (uint16_t)0x01FF);
lcd_write_cmd(1);
lcd_str_XY(0,0, "STEP:uart data2");
//Parse the received data
//First byte indicates whether the data transfer was succesful
//Second one is just a CRC8 value
if((temp_data[0] == 0xAA) && (temp_data[1] == 0x27))
{
//1st byte is equal to AA
//Success
transfer_success = 1;
break;
}
if((temp_data[0] == 0x27) && (temp_data[1] == 0x11))
{
/*lcd_write_cmd(1);
lcd_str_XY(0,0, "Blad transferu.");
lcd_str_XY(0,1, "Wybierz plik aby");
lcd_str_XY(0,2, "sprobowac ponownie.");*/
}
lcd_write_cmd(1);
lcd_str_XY(0,0, "STEP:parse");
}