【问题标题】:How to find different in days between 2 datetime object as date?如何在 2 个日期时间对象作为日期之间找到不同的天数?
【发布时间】:2016-09-14 08:45:24
【问题描述】:

我的 MySQL 数据库中有一个日期时间字段。我正在使用 Laravel,并且已经包含了 Carbon 库。我正在构建一个函数来将此日期时间字段与当前日期进行比较。目前,在 Carbon 中使用 diffInDays 函数时,结果如下:

Datetime field      | current time         | result
2016-09-13 23:59:59 | 2016-09-14 16:42:12  | 0
2016-09-13 12:05:59 | 2016-09-14 16:42:12  | 1
2016-09-12 23:59:59 | 2016-09-14 16:42:12  | 1
2016-09-12 12:05:59 | 2016-09-14 16:42:12  | 2

但是,我只想比较日期,所以我希望结果是:

Datetime field      | current time         | result
2016-09-13 23:59:59 | 2016-09-14 16:42:12  | 1
2016-09-13 12:59:59 | 2016-09-14 16:42:12  | 1
2016-09-12 23:59:59 | 2016-09-14 16:42:12  | 2
2016-09-12 12:05:59 | 2016-09-14 16:42:12  | 2

PHP/Carbon/其他库中是否已经为此预建了函数?

【问题讨论】:

  • 日期时间有diff() method;
  • 并且它返回的 DateInterval 类型有一个days 属性。
  • Carbon 扩展了 DateTime,因此就像马克说的那样,您可以使用 diff() 方法
  • 阅读问题。使用你建议的方法会导致上面提到的我不想要的。
  • 将每个操作数的时间设置为 00:00:00? 耸耸肩

标签: php mysql laravel datetime php-carbon


【解决方案1】:

最简单的方法是使用 DateTimeImmutable,将两者的时间设置为午夜(例如),然后进行 diff。这将为您带来您想要的结果。

$start = new DateTimeImmutable ("20160101T1530", $dtz);
$stop = new DateTimeImmutable ("20160102T1300", $dtz);

// DateTimeImmutable returns new objects when modified.
$chkStart = $start->modify ("midnight");
$chkStop = $stop->modify ("midnight");

// Setting second flag to "true" to get absolute difference.
$diff = $chkStart->diff ($chkStop, true);

【讨论】:

  • 你可以使用DateTimeImmutable代替克隆。
  • 感谢您的提示。不知何故,我完全错过了那节课。根据您的建议更新了我的答案。
【解决方案2】:

你可以试试这段代码

$checkDate = "2016-09-13 23:59:59";
$convertData = Carbon::parse($checkDate)->format('Y-m-d');
$createdObject = new Carbon($convertData);
$now = Carbon::now();    
$difference = $now->diffInDays($createdObject);
dd($difference);

【讨论】:

  • 与其只是发布代码并敦促 OP“尝试一下”,不如提供一些代码解释以及为什么它比 OP 的尝试更好。
【解决方案3】:

如果 carbon diff() 不适合您,您可以尝试其他方法..

在你的控制器中写..

$date1       = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2016-09-12 13:02:24');
$anotherDate = \Carbon\Carbon::parse($date1)->format('Y-m-d');

$diff = $this->time_elapsed_string(strtotime($anotherDate));
return $diff;     // 2

在你的控制器中创建一个方法..

private function time_elapsed_string($ptime)
{
    $etime = time() - $ptime;
    if ($etime < 1)
        return '0 seconds';

    $a = array( 24 * 60 * 60  =>  'day');

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1) {
            $r = floor($d);
            return intval($r);
        }
    }
}

它会让你在几天内有所不同..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多