我按日期时间对事件列表进行排序,效果很好,但是当某些项目应用了时区时会出现问题 - 它们无法正确排序。例如
事件 1 - 2018 年 6 月 20 日 15:00:00 结束(欧洲/伦敦)
事件 2 - 2018 年 6 月 20 日 13:00:00(美国/东部)结束
当这些按日期升序排列时,“事件 2”显示在“事件 1”之前,因为时区被忽略(实时时是 2 小时后)
我尝试在 Laravel 中使用一个修改器将日期时间和时区都转换为时间戳:
public function getDatetimeTzSecondsAttribute()
{
$newDate = new Carbon($this->attributes['date_finish'], $this->attributes['timezone']);
return $newDate->toTimeString();
}
但是请注意,这不会起作用,因为在获取结果后才处理增变器。我正在对结果使用分页 - 如果可能的话,通过查询构建器/ Eloquent 来排序这些数据的最佳方式是什么?
最佳答案
如果它对任何人有帮助,我经过几个小时的脑痛想出了一个非常简单的解决方案......
使用 MySQL 的“CONVERT_TZ”函数将时区设置更改为 UTC:
->selectRaw('*, CONVERT_TZ(date_finish, timezone, \'UTC\') AS date_finish_converted ')
然后按新转换的日期列(如果设置)和标准日期列排序:
->orderByRaw('COALESCE(date_finish_converted, date_finish), date_finish');
天才! :)
关于php - Laravel orderBy 带时区的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50678648/