将JSON中的时间转换为PHP的实际播放时间

时间:2016-04-30 17:12:36

标签: javascript php time

我正在开发一个应用程序,我要求整个游戏的时间,从他们购买它到现在为特定用户,这是我在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

1 个答案:

答案 0 :(得分:1)

该持续时间格式位于ISO 8601 format

你可以这样继续:

1。使用DateInterval

给定的格式几乎是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秒

2。使用preg_match_all

提取数字

此替代方案不使用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";