Giải pháp từ: //gist.github.com/stevejobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b
Mã này tránh các cuộc gọi chức năng tẻ nhạt và việc xây dựng chuỗi từng mảnh càng nhiều càng tốt, và các chức năng lớn và cồng kềnh mà mọi người đang thực hiện cho việc này.
Nó trả về một đầu ra ở định dạng "1H05M00S" và sử dụng các số 0 hàng đầu trong vài phút và giây, miễn là một thành phần thời gian khác không khác đi trước chúng.
Nó cũng bỏ qua tất cả các thành phần hàng đầu trống để tránh cung cấp cho bạn thông tin vô dụng như "0H00M01S" [thay vào đó sẽ hiển thị là "1s"].
Kết quả ví dụ: "1S", "1M00S", "19M08S", "1H00M00S", "4H08M39S".
$duration = 1; // values 0 and higher are supported!
$converted = [
'hours' => floor[ $duration / 3600 ],
'minutes' => floor[ [ $duration / 60 ] % 60 ],
'seconds' => [ $duration % 60 ]
];
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
Nếu bạn muốn làm cho mã thậm chí ngắn hơn [nhưng không thể đọc được], bạn có thể tránh mảng
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
9 và thay vào đó đặt các giá trị trực tiếp trong cuộc gọi Sprintf [], như sau:$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
Thời lượng phải là 0 hoặc cao hơn trong cả hai phần mã ở trên. Thời lượng tiêu cực không được hỗ trợ. Nhưng bạn có thể xử lý các thời lượng âm bằng cách sử dụng mã thay thế sau: Thay vào đó:
$duration = -493; // negative values are supported!
$wasNegative = FALSE;
if[ $duration < 0 ] { $wasNegative = TRUE; $duration = abs[ $duration ]; }
$converted = [
'hours' => floor[ $duration / 3600 ],
'minutes' => floor[ [ $duration / 60 ] % 60 ],
'seconds' => [ $duration % 60 ]
];
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
if[ $wasNegative ] { $result = "-{$result}"; }
// $result is now "-8m13s"
Giả sử bạn đang chạy một quá trình chạy trong nền. Nó tốt hơn để không để người dùng mất kiên nhẫn và nói với họ khi nào nó sẽ kết thúc. & Nbsp; Nhưng, bạn có thời gian còn lại trong & nbsp; giây. Nếu chúng tôi hiển thị người dùng:seconds. If we show the user :
567 seconds to complete
Anh ấy/cô ấy [người dùng] sẽ phải lấy máy tính và chuyển đổi thành vài phút hoặc hàng giờ. Hoặc nếu anh chàng/gal không phải là một thiên tài toán học, anh ta sẽ đóng UI và nói "Cái quái gì vậy?"
Điểm chính trong UI là
Don't irritate the user
Đánh dấu lời của tôi: "Bạn không nên làm cho người dùng tức giận".
Dưới đây là một chức năng đơn giản để chuyển đổi giây sang giờ, phút và giây riêng biệt hoặc trộn lẫn với nhau:
function secToHR[$seconds] {
$hours = floor[$seconds / 3600];
$minutes = floor[[$seconds / 60] % 60];
$seconds = $seconds % 60;
return "$hours:$minutes:$seconds";
}
Nếu bạn đang tự hỏi tại sao tôi chọn Sectohr làm tên hàm, thì đó là viết tắt của & nbsp; giây để có thể đọc được của con người.secToHR as the function name, it’s the abbreviation of Seconds to Human Readable.
Hoặc nếu bạn muốn hiển thị như thế này:
1 hour, 20 minutes remaining
10 minutes, 20 seconds remaining
15 seconds remaining
Sau đó, thay thế chức năng & nbsp; return bằng này:return function with this :
return $hours > 0 ? "$hours hours, $minutes minutes remaining" : [$minutes > 0 ? "$minutes minutes, $seconds seconds remaining" : "$seconds seconds remaining"];
Btw, tôi sẽ đề nghị bạn làm điều đó như ở trên ^, bởi vì nó thân thiện hơn với người dùng.
Cách sử dụng
Đơn giản như nó là:
/**
* Function with 'h:m:s' form as return value
*/
echo secToHR[560];
echo secToHR[10950];
/**
* Function with 'remaining' in return value
*/
echo secToHR[];
Và các đầu ra tương ứng:
0:9:20
3:2:30
9 minutes, 20 seconds remaining
3 hours, 2 minutes remaining
Tôi đã sử dụng điều này trong ứng dụng tải xuống như tôi đã đề cập trong bài trước.
Chuyển đổi số thứ hai thành chuỗi được định dạng giờ và phút giữa hai điểm thời gian khác nhau là khá dễ dàng. Dưới đây là một đoạn mã đơn giản có thể giúp bạn thực hiện và xuất trình chuỗi được cung cấp theo yêu cầu. Ví dụ 1: Result: Ví dụ 2:Hàm số
0$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
Cách sử dụng
1$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
2$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
3Result:
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
4Ví dụ 3:
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
5Result:
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
6Ví dụ 4:
Điểm thời gian khác nhau.
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
7Result:
$duration = 1; // values 0 and higher are supported!
$result = ltrim[ sprintf[ '%02dh%02dm%02ds', floor[ $duration / 3600 ], floor[ [ $duration / 60 ] % 60 ], [ $duration % 60 ] ], '0hm' ];
if[ $result == 's' ] { $result = '0s'; }
8