【问题标题】:Compare time using Laravel and MySQL使用 Laravel 和 MySQL 比较时间
【发布时间】:2017-02-07 05:35:55
【问题描述】:

在 Laravel 应用程序中,我的 MySQL 数据库中有一些类型为 time(不是 datetime)的列。我正在使用 Carbon 在我的模型中投射这些时间列,如下所示:

public function getStartDateAttribute()
{
    return Carbon::createFromFormat('H:i:s', $this->attributes['start_time]);
}

问题在于 Carbon 会自动将任何未指定的字段(例如月、日、年)设置为当前日期。

这会在比较时间时产生问题。

例如,假设我们有一个名为 Foo 的模型,有 2 条记录:

  • id: 10,具有start_time5:00am
  • id: 30,具有start_time3:00am

还有如下代码:

 // Date and time the code was executed is 25/11/2016
 $a = Foo::first('id', 10)->start_date; // Fetched at 11:59pm
 // ... some delay ...
 $b = Foo::first('id', 30)->start_date; // Fetched at 00:00am (date is now 26/11/2016)
 dump($a->gte($b)); // where $a and $b are carbon objects

通常最后一条语句几乎总是返回 true,因为 5:00am 晚于 3:00am。

但是,因为$a 是在晚上 11:59 获取的,$b 是在上午 00:00 获取的,所以无论 'start_date' 的值是什么,该语句总是会返回 false!

据我所知,这是一种罕见的极端情况,但事情就是这样被黑客入侵的。

因此我的问题是,处理和比较 MySQL 时间列的时间的正确方法是什么?

【问题讨论】:

    标签: mysql laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    你可以像这样使用 php strtotime 函数:

    在您的模型中:

    public function getStartTimeAttribute($value)
    {
        return strtotime($value);
    }
    

    然后在你的控制器中:

    $a = Foo::first('id', 10)->start_time; // Fetched at 11:59pm
    $b = Foo::first('id', 30)->start_time; // Fetched at 00:00am
    dump($a <= $b); // evaluates to false
    

    【讨论】:

    • 我最初对此投了赞成票,但它有完全相同的问题。如果今天的日期是1/2/2017,并且我在11:59 执行了此操作:strtotime('10:43:12) 我将获得1/2/2017 10:42:12 的时间戳。现在,如果它刚刚变成2/2/2017 并且我再次执行相同的功能,我将获得2/22017 10:42:12 的时间戳。因此,比较将是错误的!
    【解决方案2】:

    您的示例将23:59pm00:00 进行比较。您希望 00:00 大于 23:59。

    如您所知,00:00 可能在 23:59 之前或之后,因为时钟是连续的,但如果没有 date 组件,mysql / php / 任何语言都会假定它在同一天.因此,23:59 将始终在 00:00 之前。

    因此,除非您提供日期信息,否则您对代码行为方式的期望是错误的。

    此外,如果您将00:00 更改为表示第二天,那么当 00:00 实际上表示同一天时,您将遇到一个错误。

    【讨论】:

    • 我想我不够清楚。我有一个 MYSQL 时间列。这没有任何日期。因此 23:59pm 应该大于 00:00am。但是,当将时间转换为 Carbon 时,不幸的是它还包括日、月和年。如果全部设置为同一日期,这不会是一个问题,但如果日期发生变化,这将是一个大问题。我将编辑我的问题以澄清!
    • 另外,我的示例没有比较下午 23:59 或上午 00:00。这是获取数据的时间。我编辑了我的问题以使其更清楚
    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多