【问题标题】:Calculating and formatting time difference from PHP timestamp从 PHP 时间戳计算和格式化时间差
【发布时间】:2014-03-21 18:25:27
【问题描述】:

我的社区网站的禁止系统将时间记录在 MySQL 表中并带有时间戳。

我有以下代码来显示发布临时禁令的时间,但无法计算出时差。它记录禁令的方式是记录禁令发布的时间,以及临时禁令完成的时间。由此可以计算出禁令的长度……

<b>Time of ban:</b> <?php echo date('d/m/Y H:i:s', $row['time']);?><br />
<b>Time of unban:</b> <?php echo $row['temptime'];?><br />
<b>Unban time - ban time=</b> <?php echo $diff;?>

当我尝试这个时:

<b>Tempban length:</b> <?php echo date('d/m/Y H:i:s', $diff);?>

它输出Tempban length: 08/01/1970 01:00:00

请有人告诉我我哪里出了问题。非常感谢。

【问题讨论】:

  • 你似乎没有在任何地方设置$diff
  • $diff 在哪里/如何计算/设置?
  • 时差不是日期。那&lt;?php echo date('d/m/Y H:i:s', $diff);?&gt;到底是什么意思?

标签: php mysql math timestamp


【解决方案1】:

试试这个:

//time when the person was banned
$banTime =  date_format($row['time'], 'Y-m-d H:i:s'); // too make sure its the right format
$banLifted = date_format($row['temptime'], 'Y-m-d H:i:s');

$bt = new Datetime($banTime);
$bl = new Datetime($banLifted);

$diffTime = $bl->diff($bt);

你能看看这是否符合你的目的..

您可以随时致电:

$diffTime ->format('%R%a days'); //for number or days

查看这里了解更多信息datetime

丁丁

【讨论】:

  • 您的方法更好且更短,但仅从 5.3 开始
【解决方案2】:
$diff = $row['temptime'] - $row['time'];

$diff_years   = floor($diff / (365*60*60*24));
$diff_monthes  = floor(($diff - $diff_years * 365*60*60*24) / (30*60*60*24));
$diff_days    = floor(($diff - $diff_years * 365*60*60*24 - $diff_monthes*30*60*60*24)/ (60*60*24));

$diff_hours   = floor(($diff - $diff_years * 365*60*60*24 - $diff_monthes*30*60*60*24 - $diff_days*60*60*24)/ (60*60));
$diff_minutes  = floor(($diff - $diff_years * 365*60*60*24 - $diff_monthes*30*60*60*24 - $diff_days*60*60*24 - $diff_hours*60*60)/ 60);

// here you can format output, using variables above, for example:
$diff = $diff_hours." hours, ".$diff_minutes." minutes.";

<b>Tempban length:</b> <?php echo $diff;?>

【讨论】:

  • 严重吗?计算时间戳差异?
  • @dbf,这里有什么不严重的?这种方法我用过很多次,效果很好
  • @Ozerich 您刚刚设法制作了 135 个字符长的行。有点太长了?
  • @Ozerich 我认为使用 $months 总是一个坏主意,因为它们不是每 30 天。
  • @bwoebi,感谢您发现错误。我在发布项目中使用过这个功能,现在我必须重新制作这个功能
【解决方案3】:

你没有错。 date() 适用于自 1/1/1970 00:00:00 以来的秒数。因此,当您将86400*8 + 3600*1 秒作为差异时,您将拥有08/01/1970 01:00:00 作为输出。你也会有一个与你的时区相对应的差异。

你必须使用你自己的函数来显示时间:

($seconds 在你的代码中被称为$diff)

$years = floor($seconds / 365 * 86400);
$days = floor(($seconds -= $years * 365 * 86400) / 86400);
$hours = floor(($seconds -= $days * 86400) / 3600);
$minutes = floor(($seconds -= $hours * 3600) / 60);
$seconds -= $minutes * 60;
echo "$years years, $days days, $hours hours, $minutes minutes and $seconds seconds";

【讨论】:

  • @JamesAllison 输出是什么?
【解决方案4】:

($row['temptime'] -$row['time'] )/60 让您在minute 中有所不同

【讨论】:

    【解决方案5】:

    我认为最好的方法是

    • $diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多