【问题标题】:PHP Minus/Subtract Hour/Minute strings formated H:iPHP 减/减小时/分钟字符串格式 H:i
【发布时间】:2019-05-27 20:53:47
【问题描述】:

我有一个 PHP 函数,当给定两个值小时/分钟时,它将两个值相加,例如:

00:20 + 00:15 = 00:35

函数如下:

function sumHoursAndMinutes() {
    $i = 0;
    foreach(func_get_args() as $time) {
        sscanf($time, '%d:%d', $hour, $min);
        $i += $hour * 60 + $min;
    }

    if( $h = floor($i / 60) ) {
        $i %= 60;
    }

    return sprintf('%02d:%02d', $h, $i);
}
// Usage: sumHoursAndMinutes("00:20", "00:15");

输出:“00:35”

我怎样才能在减法中达到同样的效果,例如:00:20 - 00:15 = 00:05

【问题讨论】:

  • Usage: sumHoursAndMinutes("00:20", "00:15"); - 当你没有函数参数时,这个有效的语法如何?
  • Subtract time in PHP的可能重复
  • @treyBake 函数使用 func_get_args()
  • 啊我明白了 - 错过了 - 作为一个注释,使用参数更好:)
  • 我尝试了那个问题的答案,结果不同,找不到我要找的东西@treyBake

标签: php function datetime


【解决方案1】:

您可以使用 date() 和 strtotime()。

记得之后再将时区设置回默认值。
我们需要 UTC 时区,不必担心 DST 或时区差异。

$a = "00:20";
$b = "00:15";

date_default_timezone_set("UTC");

echo date("H:i", strtotime($a) + strtotime($b));
echo "\n\n";
echo date("H:i", strtotime($a) - strtotime($b));

date_default_timezone_set("Your_default_timezone");

//00:35
//00:05

https://3v4l.org/kIVlI


如果您需要从 strtotime 手动计算小时和分钟。

如果您想要添加,则需要从结果中删除 strtotime("00:00")*2,因为我们使用的是 Unix 时间。
然后我使用 str_pad 来格式化小时和分钟。

$a = "00:20";
$b = "02:15";

date_default_timezone_set("UTC");

// If addition
$diff = strtotime($a) + strtotime($b) - strtotime("00:00")*2;
$hours = floor($diff /3600);
$minutes = ($diff -($hours *3600))/60;

echo str_pad($hours,2,0, STR_PAD_LEFT) . ":" . str_pad($minutes,2,0, STR_PAD_LEFT) ;


echo "\n\n";


//If subtraction
$diff = strtotime($a) - strtotime($b);
$hours = floor($diff /3600);
$minutes = ($diff -($hours *3600))/60;

echo str_pad($hours,2,0, STR_PAD_LEFT) . ":" . str_pad($minutes,2,0, STR_PAD_LEFT) ;


//date_default_timezone_set("Your_default_timezone");

//02:35
//-2:05

【讨论】:

  • 虽然我发现这是一个非常巧妙的解决方案,但您必须指出,如果 $b > $a- 行中,它将返回(不是很好检测到的)垃圾。这也不适用于hours > 24,并且由于它被视为真实日期而存在一些问题。
  • @maio290 这是真的。我认为/认为 OP 只需要一个简单的计算。但它可以很容易地重新编码以处理您列出的情况。
  • 当我有像 114:30 - 2:45 这样的值时它不起作用
  • @user3475530 这与您的问题相去甚远。下次尝试用相关数字提出问题
【解决方案2】:

这可能看起来很长,但我个人只是将其转换为分钟。这使它更容易处理,我使用了一种重新格式化方法来达到以下目的:如果你的 substractTimeFromTimeaddTimeToTime 返回了 <0,你知道,你的输入有问题,或者它没有任何意义在你的上下文中。此外,您需要验证时间是否有效,因为 01:99 现在将是一个有效的输入。我只是假设您之前进行了验证。

function reformatMinutes($minutes)
{
    $hours = intval($minutes/60);
    $minutes -= $hours*60;
    return sprintf("%02d:%02d",$hours,$minutes);
}

function addTimeToTime($time1, $time2)
{
    $time1 = explode(":",$time1);
    $time2 = explode(":",$time2);
    $sumOfMinutes = intval($time1[0])*60+intval($time2[0])*60+intval($time1[1])+intval($time2[1]);
    return $sumOfMinutes;

}

function substractTimeFromTime($basis,$subtract)
{
    $basis = explode(":",$basis);
    $subtract = explode(":",$subtract);
    $remainingMinutes = intval($basis[0])*60-intval($subtract[0])*60+intval($basis[1])-intval($subtract[1]);
    return $remainingMinutes;       
}

$resultPlus = addTimeToTime("01:10","00:15");
$resultMinus = substractTimeFromTime("01:30","00:15");
echo reformatMinutes($resultPlus);
echo reformatMinutes($resultMinus);

这个输出:

01:25
01:15

【讨论】:

    【解决方案3】:

    要么为减号编写一个几乎相同的函数而不是加号,要么添加一个默认为加号但可以设置为减号的可选布尔参数。

    【讨论】:

    • 我将加号改为减号,但我无法得到想要的结果,好像我无法正确计算:)
    猜你喜欢
    • 2023-04-07
    • 2011-02-15
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2022-11-01
    • 2022-01-21
    • 2014-04-04
    相关资源
    最近更新 更多