【问题标题】:Given number of hours get number of months, days, hours, and minutes PHP给定小时数获取月数、天数、小时数和分钟数 PHP
【发布时间】:2014-01-03 15:42:59
【问题描述】:

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

有一列包含小时数,所以它可能是 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';

如果您知道可以实现此目的的功能或更简单的方法,请提供帮助。

【问题讨论】:

  • 相对于原始日期的小时数?
  • 没有用户定义。所以用户基本上选择天数/月数/小时/分钟数并转换为小时数并保存在数据库中
  • 那么,一个月是几月? 28天还是2月29?为什么甚至是二月? 30、31?...此外,还有闰秒(但在你的情况下它们并不重要)
  • 使用 小时 是我见过的最愚蠢的时间存储单位。
  • 我知道,但我无能为力

标签: php date time


【解决方案1】:

您可以使用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() 这些字符的含义。您还可以直接以echo $diff->days; echo $diff->h; // etc. 访问DateInterval 对象上的参数(使用print_r($diff); 来查看这些参数)。

【讨论】:

  • 有趣的方法。 +1(@0 时间戳对于新用户来说可能不太容易理解,所以我认为最好也对代码进行一些解释):)
  • 这解决了它。非常感谢您将阅读有关 DateTime 扩展的更多信息。
【解决方案2】:

一个月有多长? 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

【讨论】:

  • 谢谢,我想我可以忽略月份并显示天 + 小时 + 分钟比仅仅小时更好
【解决方案3】:

首先小时的事情是疯狂的。我假设它们总是被调整为最新的(即发生某事的 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

也许我过于简单化了。

【讨论】:

  • strtotime() 不适用于十进制数,因此此示例不起作用。检查date_parse('+23.33 hours');返回什么,你会发现它不是你所期望的。
【解决方案4】:

如果您填充 $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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2020-11-21
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多