PHP减去并增加时间

时间:2016-06-15 07:24:16

标签: php

我现在正在寻找几个小时的答案,但我找不到答案。

我正在编写简单的脚本。用户设置工作开始时间和结束时间。

这是我的代码:

$grand=0;
$query = "SELECT DISTINCT StartTime,EndTime FROM tblWeekSchedule WHERE FCode='101'";
$query = safe_query($query);
$gquery = gather_info_in_array($query);
foreach ($gquery as $z) {
    $s = $z['StartTime'];
    $e = $z['EndTime'];
    $tutal = date_create($s)->diff(date_create($e))->format('%H:%I');
    $grand+=$tutal;
}
echo $grand;

输出始终为整数示例10 ..我想让它像这个例子10:30

我是编程的新手.. ang愿意学习..提前谢谢

4 个答案:

答案 0 :(得分:0)

转换为unix时间戳。

简单例如;

$n = time();
echo $n; // 1465977786, (when I ran it.
$t = date("Y-m-d H:i:s", $n);
echo $t; //2016-06-15 13:33:06

$x = 1465976585;
$t = date("Y-m-d H:i:s", $x);
echo $t; //2016-06-15 13:13:05

$t = $n - $x;
echo $t; //1201

两次1201秒的差异。现在简单的数学除以60来提取小时等等。

您将遇到的问题是日期的变化,即。午夜。比如说下午6点和凌晨2点。因此最好将CURRENT_TIMESTAMP保存到MySQL,这样就可以在一个字段中获得所有必要的信息。

从MySQL获取unix时间戳;

$sql = "SELECT DISTINCT UNIX_TIMESTAMP(的StartTime ),UNIX_TIMESTAMP(结束时间) FROM tblWeekSchedule WHERE FCode='101'";

答案 1 :(得分:0)

您的问题出在最后一行:$grand+=$tutal;

这一行在$grand$tutal之间进行了数字加法。

但是,$tutal不是数字 - 它是一个字符串。它看起来像10:30,但如果你对它进行+=,PHP会在添加之前将其转换为数字。此转换将产生数字10,因为:是非数字的,因此PHP会删除冒号后的所有内容以进行添加。

通过将它们添加到$grand,您要尝试做什么并不完全清楚。你想加上小时数吗?

你说你正在尝试添加小时和分钟。

事实是你使用日期对象过于复杂。只需使用unix时间戳,即可轻松减去它们,而无需使用DateTime::diff()等函数。

这是一个更好的解决方案:

foreach ($gquery as $z) {
    $s = $z['StartTime'];  //I assume that StartTime is a unix timestamp? if not, convert it to one on this line.
    $e = $z['EndTime'];    //I assume that EndTime is a unix timestamp? if not, convert it to one on this line.

    $tutal = $e - $s;      // unix timestamps are integers, so can be subtracted easily to get the time difference.
    $grand += $tutal;      // $grand will now be the total number of seconds of all your time differences.
}

$grand_minutes = floor($grand / 60);        // get the number of minutes (ignore any left-over seconds.
$grand_hours = floor($grand_minutes / 60);  // get the number of hours (ignore any left-over minutes)
$remainder_minutes = $grand_minutes % 60;   // now we get the left-over minutes.

echo "Total time: {$grand_hours}:{$remainder_minutes}\n";

(假设$z['StartTime']$z['EndTime']`是unix时间戳;如果不是,请在此代码之前将它们转换为时间戳格式)

答案 2 :(得分:0)

我创建了我的评论答案,以便更容易看出我的意思 这将以秒为单位计算所有内容,$ tutal和$ grand将是整数值,从而使计算更容易。

$grand=0;
$query = "SELECT DISTINCT StartTime,EndTime FROM tblWeekSchedule WHERE FCode='101'";
$query = safe_query($query);
$gquery = gather_info_in_array($query);
foreach ($gquery as $z) {
    $s = $z['StartTime'];
    $e = $z['EndTime'];
    $tutal = strtotime($e)-strtotime($s);
    $grand+=$tutal;
}
echo date("H:i", $grand);

希望它适合你。

答案 3 :(得分:0)

检查这个逻辑。

 val myFilteredListWithDesiredOneItem = unfilteredList
    .filter(x => x.getId.equals(something))
    .VERIFY AMOUNT
    .toList