2011-01-21 65 views
10

Tôi đã có một kịch bản mà mất trong một giá trị trong vài giây (2 điểm thập phân của giây phân đoạn):PHP - Chuyển đổi mili giây để Giờ: Phút: Seconds.fractional

$seconds_input = 23.75 

sau đó tôi chuyển nó sang mili giây:

$milliseconds = $seconds_input * 1000; // --> 23750 

Và sau đó tôi muốn định dạng nó như vậy:

H:M:S.x // --> 0:0:23.75 

đâu 'x' là fracti vào ngày thứ hai (tuy nhiên nhiều nơi sau số thập phân có).

Bất kỳ trợ giúp nào? Tôi dường như không thể che giấu được điều này. Tôi đã thử bằng cách sử dụng gmdate() nhưng nó giữ lopping off các giây phân số.

Cảm ơn.

+0

http://us.php.net/manual/en/function.sprintf.php – scragz

+0

Chỉ muốn thêm vào đó là để tạo ra giá trị đầu vào cho trường -ss của FFMPEG. Bằng cách bao gồm các giây phân số, nó cải thiện độ chi tiết của khung mục tiêu và cung cấp cho người dùng hầu như khung * chính xác * mà họ đang xem trong trình phát video. Cảm ơn một lần nữa tất cả mọi người, bạn đã tiết kiệm cho tôi một tấn thời gian. – AJB

Trả lời

17

tôi mất

function formatSeconds($seconds) 
{ 
    $hours = 0; 
    $milliseconds = str_replace("0.", '', $seconds - floor($seconds)); 

    if ($seconds > 3600) 
    { 
    $hours = floor($seconds/3600); 
    } 
    $seconds = $seconds % 3600; 


    return str_pad($hours, 2, '0', STR_PAD_LEFT) 
     . gmdate(':i:s', $seconds) 
     . ($milliseconds ? ".$milliseconds" : '') 
    ; 
} 

Và sau đó kiểm tra

$testData = array(
    23,    // Seconds, w/o millis 
    23.75,   // Seconds, w/millis 
    23.75123456789, // Lots of millis 
    123456789.75 // Lots of seconds 
); 

foreach ($testData as $seconds) 
{ 
    echo formatSeconds($seconds), PHP_EOL; 
} 

trong đó sản lượng

00:00:23 
00:00:23.75 
00:00:23.75123456789 
34293:33:09.75 
+1

Tôi thích Stack Overflow. Cảm ơn mọi người. Tôi thậm chí không chắc tôi thích cái nào nhất. – AJB

+0

Tôi là một php noob, tôi thấy rằng @ ircmaxell's đã không làm việc cho tất cả các giá trị. Trong trường hợp của tôi, giá trị ms là: 1189107. Tôi nhận được khoảng 23 giờ bằng cách sử dụng chức năng ircmaxell và 00,19: 49 sử dụng của bạn. – zengr

17

Chỉnh sửa: Vâng, tôi hơi vội vã. Dưới đây là một cách để thực hiện những gì bạn đang yêu cầu:

function formatMilliseconds($milliseconds) { 
    $seconds = floor($milliseconds/1000); 
    $minutes = floor($seconds/60); 
    $hours = floor($minutes/60); 
    $milliseconds = $milliseconds % 1000; 
    $seconds = $seconds % 60; 
    $minutes = $minutes % 60; 

    $format = '%u:%02u:%02u.%03u'; 
    $time = sprintf($format, $hours, $minutes, $seconds, $milliseconds); 
    return rtrim($time, '0'); 
} 
+0

Chắc chắn không phải là cách duy nhất, nhưng nó thông minh và dễ dàng, mặc dù. – GolezTrol

+0

Từ những gì tôi thu thập, họ đang nói về một khoảng thời gian mặc dù, và không phải là một ngày giờ. – scragz

+0

Đó có thể là một vấn đề, nhưng chỉ khi thời lượng trên 24 giờ. – GolezTrol

2

Mỏ ít dễ đọc hơn, vì vậy nó phải tốt hơn. : p

Về cơ bản ý tưởng tương tự như phiên bản @ ircmaxell. Nó cắt các dấu '0 và thậm chí sẽ bỏ qua'. ' tách nếu mili giây là 0.

<? 

function format_period($seconds_input) 
{ 
    $hours = (int)($minutes = (int)($seconds = (int)($milliseconds = (int)($seconds_input * 1000))/1000)/60)/60; 
    return $hours.':'.($minutes%60).':'.($seconds%60).(($milliseconds===0)?'':'.'.rtrim($milliseconds%1000, '0')); 
} 

echo format_period(23.75); 
+3

LOL @ * Mỏ ít dễ đọc hơn, vì vậy nó phải tốt hơn. : p * ... – ircmaxell

+0

Tôi yêu Stack Overflow. Cảm ơn mọi người. Tôi thậm chí không chắc tôi thích cái nào nhất. – AJB

1

nếu bạn thực sự muốn làm điều đó bằng chức năng ngày bạn đúng, bạn phải đối phó với wit h mili giây bên ngoài, chỉ dựa trên dấu thời gian thứ hai.

bạn có thể làm một cái gì đó như thế này:

<? 
$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; 

nhưng chú ý đến giờ tràn, nếu giờ bạn vượt quá 24 bạn có lẽ sẽ kết thúc vứt bỏ những ngày.

trong trường hợp của bạn tôi sẽ nói cách tiếp cận của bạn với sàn để có được những giây là đúng, và sau đó bạn nên có lẽ chỉ cần sử dụng arithmetics modulo như thế này:

<? 
$totalsecs = 86400*10; 

$secs = $totalsecs%60; 

echo "secs: $secs \n"; 

$minutes = ($totalsecs - $secs) % (60*60); 

> và vân vân ..

+0

Tôi thích Stack Overflow. Cảm ơn mọi người. Tôi thậm chí không chắc tôi thích cái nào nhất. – AJB

Các vấn đề liên quan