2012-11-26 40 views
6

Tôi muốn hiển thị khoảng thời gian được tính theo giờ, phút và giây, một số khoảng thời gian lớn hơn 24 giờ. Hiện tại tôi đang thử điều này:Giờ mở rộng PHP(): Hiển thị thời lượng lớn hơn 24 giờ nhưng không phải là ngày nếu lớn hơn 24 giờ

$timeLength = new DateTime(); 
$timeLength->setTime(25, 30); 
echo $timeLength->format('H:m:i'); // 01:30:00 

Tôi muốn hiển thị 25:30:00.

Tôi đang tìm kiếm tốt hơn cho giải pháp hướng đối tượng.

Cảm ơn :)

+0

Bạn có cần tạo phiên bản DateTime không? Có vẻ như bạn đã có giờ. – shapeshifter

+0

Tôi đã đơn giản hóa vấn đề để làm cho nó dễ đọc hơn. Các cá thể DateTime đang được tạo với khối lượng lớn các giây. Vì vậy, nó thực sự giống như '$ timeLength-> setTime (0, 0, 6534293)'. – jcroll

+1

Vì bạn đã có thứ hai, tại sao bạn không tính toán nó? – Passerby

Trả lời

7

Vì bạn đã có độ dài chỉ trong vài giây, bạn chỉ có thể tính toán nó:

function timeLength($sec) 
{ 
    $s=$sec % 60; 
    $m=(($sec-$s)/60) % 60; 
    $h=floor($sec/3600); 
    return $h.":".substr("0".$m,-2).":".substr("0".$s,-2); 
} 
echo timeLength(6534293); //outputs "1815:04:53" 

Nếu bạn thực sự muốn sử dụng DateTime đối tượng, đây là một (loại gian lận) giải pháp:

function dtLength($sec) 
{ 
    $t=new DateTime("@".$sec); 
    $r=new DateTime("@0"); 
    $i=$t->diff($r); 
    $h=intval($i->format("%a"))*24+intval($i->format("%H")); 
    return $h.":".$i->format("%I:%S"); 
} 
echo dtLength(6534293); //outputs "1815:04:53" too 

Nếu bạn cần OO và không ngại tạo lớp học của riêng mình, bạn có thể thử

class DTInterval 
{ 
    private $sec=0; 
    function __construct($s){$this->sec=$sec;} 
    function formet($format) 
    { 
     /*$h=...,$m=...,$s=...*/ 
     $rst=str_replace("H",$h,$format);/*etc.etc.*/ 
     return $rst; 
    } 
} 
+0

+1 cho phương pháp tiếp cận OO, tôi sẽ xem liệu điều này có thể được cải thiện hay không. – Fr0zenFyr

2

DateTime xử lý thời gian trong ngày, không phải khoảng thời gian. Và vì không có 25 giờ, đó là điều sai lầm khi sử dụng. Tuy nhiên, có DateInterval, xử lý các khoảng ngày. Sử dụng nó hoặc thực hiện một số phép tính thủ công. Ngay cả với DateInterval mặc dù bạn sẽ phải thực hiện một số phép tính, vì nó sẽ chia nhỏ một khoảng thời gian thành ngày và giờ. Điều thuận lợi nhất để làm là tính toán những gì bạn cần dựa trên số giây bạn đã có.

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