php - Laravel orderBy 带时区的日期时间

标签 php mysql laravel laravel-5 laravel-5.4

我按日期时间对事件列表进行排序,效果很好,但是当某些项目应用了时区时会出现问题 - 它们无法正确排序。例如

事件 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/

相关文章:

mysql - 无法获取 laravel 中的关系数据

Laravel 5 每 30 秒调度一次作业

javascript - 如何将 html 从当前页面附加到另一个页面?

PHPunit - 错误

mysql - TimeStamp 列始终为零值

javascript - 如何在 Electron 应用程序中本地保存图像

php - 将我的 php 数组转换为 [object Object] json/JavaScript

php - DataTables 1.9.4 - 限制结果

php - 选择下拉值检查并显示数据库中是否不存在

javascript - formData 的参数之一可以包含对象吗?