使用delphi将HH:MM:SS转换为秒或分钟

时间:2014-05-02 04:36:01

标签: delphi datetime time

有人可以告诉我关于将持续时间格式化为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

感谢

4 个答案:

答案 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");
}