问题 使用碳来知道时间是否落在两个时间点之内


我正在使用Laravel。我刚碰到过 Carbon 哪个已经在供应商文件夹中。我做了一些快速搜索,发现它是PHP日期时间的一个很好的扩展。

在我的应用程序的某个地方,我需要一个逻辑来检查给定时间是否落在两个时间点之间。让我们说,我想检查10:00是否落在时间9:55和10:05之间。当然,它会下降,但我应该如何在Carbon的帮助下使用这种逻辑。

默认 Carbon::now() 将返回日期和时间 2014-12-02 14:37:18 格式。我在想是否只能提取时间部分,即 14:37:18 然后我可以比较两次,以了解测试时间是否属于两个时间点。

如果我直接检查两个Carbon对象,它也会尝试检查年份。但我所需要的只是时间部分。

事实上,我甚至不确定如果时间(h:m:s)可以直接通过碳进行比较。


3147
2017-12-02 09:20


起源

找到格式和比较的示例 这里 - Matt Burrow


答案:


是的,有一种方法可以在Carbon中执行此操作,只需查看文档即可 这里

要确定当前实例是否在两个其他实例之间,您可以使用恰当命名的between()方法。第三个参数表示是否应该进行相等的比较。默认值为true,用于确定其是否在边界之间。

$first = Carbon::create(2012, 9, 5, 1);
$second = Carbon::create(2012, 9, 5, 5);
var_dump(Carbon::create(2012, 9, 5, 3)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second, false));   // bool(false)

15
2018-06-25 12:11



between() 不适用于第二个 var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second)); // bool(true) 因为它返回 false。它与时区有关吗??? - Pathros
我不是碳专家,会测试并回来。 - Kyslik
谢谢。我找到了原因:我改变了 today() 为了 now() 功能。前者在午夜返回日期(2016-05-13 00:00:00)而后者在您查看信息时返回日期(2016-05-13 08:48:36)。参考 这里。 - Pathros


UNIX时间对于此类任务更容易。

因此,您可以使用strtotime将您的时髦表示转换为颈部表示,并像真人一样进行比较。 由于您只想比较小时数,因此您可以通过使用相对时间来解决此问题。

<?php
$now = time();
$startTime = strtotime( "12:10:24", $now );
$endTime = strtotime( "14:24:45", $now );
$point = strtotime("12:25:40", $now );
if( $point >= $startTime && $point <= $endTime )
{
  echo "Inside\n";
} else {
  echo "Outside\n";
}
?>

输出:

$ php test.php 2> /dev/null
Inside

1
2017-12-02 09:40



我认为通过Carbon会有更简单的方法。我希望像Carbon这样:(点) - >之间(开始,结束)。是的,就是这么多。还在等待,如果有这样的方式。但此刻我刚做了你告诉你要做的事,“就像一个真正的男人” - Nirmalz Thapaz
哈哈,对这个傲慢的帖子感到抱歉,这并不意味着:)我不知道Carbon,它可能包含这样的功能,否则,它将是一个明显的功能添加到它。 :) - DusteD