Если вы действительно хотите сделать это с помощью функции даты, то вы правы, вам приходится иметь дело с миллисекундами извне, только на основе временных меток.
вы можете сделать что-то вроде этого:
<?
$input = "23.75";
$seconds = floor($input);
$date = DateTime::createFromFormat('s', floor($seconds));
$ms = ($input-$seconds);
if($ms == 0) {
$ms = "";
} else {
$ms = ltrim($ms,"0,");
}
echo $date->format('H:i:s').$ms;
но помните о переполнении часа, если ваши часы превышают 24, вы, вероятно, в конечном итоге отбросите дни.
в вашем случае я бы сказал, что ваш подход с полом, чтобы получить секунды, правильныйи тогда вам, вероятно, следует просто использовать арифметику по модулю, например так:
<?
$totalsecs = 86400*10;
$secs = $totalsecs%60;
echo "secs: $secs \n";
$minutes = ($totalsecs - $secs) % (60*60);
?> и т. д.