带时区的laravel orderby datetime

rdrgkggo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(418)

我正在按日期时间排序事件列表,这样做很好,但是当某些项目应用了时区时会出现问题—它们的排序不正确。例如
活动1-2018年6月20日15:00:00结束(欧洲/伦敦)
事件2-2018年6月20日13:00:00结束(美国/东部)
当这些按日期升序排列时,“事件2”显示在“事件1”之前,因为时区被忽略(实时时是2小时之后)
我曾尝试使用laravel中的mutator将datetimes和timezones转换为时间戳:

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

    return $newDate->toTimeString();
}

但要明白,这是行不通的,因为在获取结果之后,会处理变种。我对结果使用分页-如果可能的话,通过查询生成器/eloquent对数据排序的最佳方式是什么?

fcipmucu

fcipmucu1#

如果这对任何人都有帮助的话,我在几个小时的脑痛之后想出了一个非常简单的解决办法。。。
使用mysql的“convert\u tz”函数将时区设置更改为utc:

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

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

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

天才!:)

相关问题