给定小时数获取PHP的月数,天数,小时数和分钟数

时间:2014-01-03 15:42:59

标签: php date time

我知道可能有不同的方式使用时间戳和东西,但我很难将小时数转换成人类会理解的东西。我无权更改数据库中的任何内容。

有一个列可以保持小时数,因此它可以是 134.37 小时。现在我无法显示并告诉用户134.37小时内会发生某些事情我需要将其转换为数月,日,小时,分钟,秒。

例如:

给定时间: 23.33

预期结果: 0个月,0天,23小时,19分钟,48秒(不关心秒数)

现在我需要几个月和几天,因为小时数可能很大。我开始使用的代码确实给了我小时,分钟和秒的数量,但我不能得到几天和几个月。

$months = $days = $hour = $min = $sec = 0;

$decimalHours = 23.33;

//convert to hours
$hour = (int)$decimalHours;
$decimalHours -= $hour;

//convert to minutes and subtract minutes
$decimalHours *= 60;
$min = (int)$decimalHours;
$decimalHours -= $min;
$decimalHours = number_format($decimalHours, 10);

//convert to seconds
$decimalHours *= 60;
$sec = (int)$decimalHours;

echo $hour . ' hours, ' . $min . ' minutes, ' . $sec . ' seconds';

如果你知道一个功能或更简单的方法,请提供帮助。

4 个答案:

答案 0 :(得分:3)

一个月有多长? 30天? 31天? 30.5天? 365.24 / 12

跳过这个,你可以这样做:

$hours = 23.33;
$days = floor($hours / 24);
$remaining_hours = $hours - $days * 24;
$hours = floor($remaining_hours);
$minutes = round(($remaining_hours - $hours) * 60);
echo $days . " days " . $hours . " hours " . $minutes . " minutes";
// 0 days 23 hours 20 minutes

答案 1 :(得分:2)

您可以使用DateTime扩展程序实现此目的:

$hours   = 23.33;
$zero    = new DateTime('@0');
$offset  = new DateTime('@' . $hours * 3600);
$diff    = $zero->diff($offset);
echo $diff->format('%m Months, %d Days, %h Hours, %i Minutes');

demo

代码new DateTime('@0');使用时间戳DateTime创建0个对象,即January 1 1970 00:00:00 GMT。时间戳0是自Unix纪元以来的零秒数。
在这个例子中,它基本上与你如何创建DateTime对象无关,我只是希望它在UTC偏移量和忽略DST。您还可以创建DateTime对象,例如new DateTime('UTC');(这是UTC时区中的当前日期时间)或熟悉的东西。

修改

  

我想我可以忽略几个月并且显示天+小时+分钟优于小时

在这种情况下,只需使用echo $diff->format('%a Days, %h Hours, %i Minutes');即可。查看我从%d%a替换天数格式的差异。阅读DateInterval::format()这个字符的含义。您也可以直接在DateInterval个对象上以echo $diff->days; echo $diff->h; // etc.的形式访问参数(使用print_r($diff);查看这些参数)。

答案 2 :(得分:0)

首先关闭小时的事情是疯狂的。我假设他们总是被调整为当前(即10小时发生的事情...... 9小时...... 8小时)

但你尝试过一种简单的php strtotime()方法吗?使用时间戳将输出格式化为日期/时间/倒计时?

$dateFromToday = strtotime('+23.33 hours'); // get unixtimestamp from today + hours
echo date('l jS \of F Y h:i:s A', $dateFromToday); // format my date output

也许我过分简化了。

答案 3 :(得分:0)

如果您填充$datetime变量(抱歉非常规变量名称),则适用以下代码。

此:

$original = 23.33;

$hours = floor($original);
$minutes = floor(60 * ($original - $hours));

echo sprintf('Total: %s hours, %s minutes', $hours, $minutes);
echo '<br />';

$datetime = new \DateTime('-2 hours 15 minutes');
$destined = new \DateTime(sprintf('+ %s hours %s minutes', $hours, $minutes));

echo sprintf('Scheduled Time: %s', $destined->format('Y-m-d sH:i:s'));
echo '<br />';

$interval = $destined->diff($datetime);
echo sprintf('Time Remaining: %s months, %s days, %s hours, %s minutes', 
    $interval->m, $interval->d, $interval->h, $interval->i);

输出:

Total: 23 hours, 19 minutes
Scheduled Time: 2014-01-04 1915:15:19
Time Remaining: 0 months, 1 days, 1 hours, 4 minutes