我正在开发一个应用程序,我要求整个游戏的时间,从他们购买它到现在为特定用户,这是我在JSON中得到的结果。
{
"TotalTimePlayed": "PT48M26.4570633S"
}
我需要将其转换为:月,日,小时,分钟,秒
在我看来,这是我的变量的显示方式:
{{ $TotalTimePlayed }}
我如何将其转换为可读时间?
/ **********编辑**************** /
我从帮助文件插入了prettyDate函数,但是显示错误的时间
{{ prettyDate($TotalTimePlayed) }}
在helper.php文件中:
function prettyDate($date) {
return date("d h, I", strtotime($date));
}
/ *****编辑****** /
我希望它像这样对于eaxample: 1M,22D,6H,45M,56S
答案 0 :(得分:1)
该持续时间格式位于ISO 8601 format。
你可以这样继续:
给定的格式几乎是PHP DateInterval class所期望的格式,但它不允许使用小数。
因此,我们可以首先删除该小数部分,然后使用此类生成输出:
$json = '{
"TotalTimePlayed": "PT48M26.4570633S"
}';
// Interpret JSON
$obj = json_decode($json);
// Get value, and strip fractional part (not supported by DateInterval)
$value = preg_replace("/\.\d+/", "", $obj->TotalTimePlayed);
// Turn this into a DateInterval instance
$interval = new DateInterval($value);
// Use format method to get the desired output
echo $interval->format('%m months, %d days, %h hours, %i minutes, %s seconds');
示例数据的输出为:
0个月,0天,0小时,48分钟,26秒
此替代方案不使用DateInterval
,因此可以处理小数秒:
// Sample data:
$json = '{
"TotalTimePlayed": "PT48M26.4570633S"
}';
// Interpret JSON
$obj = json_decode($json);
// Extract all numbers in that "PT" format into an array
preg_match_all("/[\d.]+/", $obj->TotalTimePlayed, $parts);
// Convert string representations to numbers
$parts = array_map('floatval', $parts[0]);
// Pad the array on the left in order to get 5 elements (months, days, hours, minutes, seconds)
$parts = array_pad($parts, -5, 0);
// Output (just for checking)
echo json_encode($parts);
输出:
[0,0,0,48,26.4570633]
如果您不想要秒的小数部分,请在上面的代码中将'floatval'
替换为'intval'
:
$parts = array_map('intval', $parts[0]);
然后该示例将作为输出:
[0,0,0,48,26]
然后你可以这样做:
$playtime = $parts[0] . " months, " .
$parts[1] . " days, " .
$parts[2] . " hours, " .
$parts[3] . " minutes, and " .
$parts[4] . " seconds";