【发布时间】: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_time的5:00am -
id: 30,具有start_time的3: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