Laravel orderBy datetime with timezone

时间:2018-06-04 10:37:39

标签: php mysql laravel laravel-5 laravel-5.4

我按日期时间排序事件列表工作正常,但是当某些项目有时区应用时会出现问题 - 他们没有正确排序。 E.g。

活动1 - 结束于2018年6月20日15:00:00(欧洲/伦敦)

活动2 - 结束于2018年6月20日13:00:00(美国/东部)

当这些按日期升序排序时'事件2'显示之前'事件1'因为时区被忽略(实时是2小时后)

我尝试在Laravel中使用mutator将日期时间和时区转换为时间戳:

 public function getDatetimeTzSecondsAttribute()
{
    $newDate = new Carbon($this->attributes['date_finish'], $this->attributes['timezone']);

    return $newDate->toTimeString();
}

但是理解这一点不会起作用,因为在获取结果后处理变异器。我正在使用分页结果 - 如果可能的话,通过查询构建器/ eloquent订购此数据的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

如果对任何人有帮助,我会在经过几个小时的脑痛后想出一个非常简单的解决方案......

使用MySQL' CONVERT_TZ'功能从时区设置更改为UTC:

->selectRaw('*, CONVERT_TZ(date_finish, timezone, \'UTC\') AS date_finish_converted ')

然后按新转换的日期列(如果已设置)和标准日期列进行排序:

->orderByRaw('COALESCE(date_finish_converted, date_finish), date_finish');

天才! :)