You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中JavaScript Date与Carbon时间戳比较错误排查

问题

在我的Laravel应用中,我尝试检查指定时间戳(lastTimeFocused)之后创建的新记录,但得到了错误结果。使用的代码如下:

$newLikes = Like::where('liked_id','=',$request['user_id'])->where('created_at','>',$lastTimeFocused)->get();

其中lastTimeFocused是前端通过new Date()获取的应用屏幕上次聚焦时间,我获取了大量本应是“之后”创建的结果,但查看记录的created_at时间戳发现并非如此:

"lastTimeFocused": "2023-08-03T12:10:33.195Z",
"created_at": "2023-08-03T11:56:32.000000Z"

为何会出现created_at早于lastTimeFocused却被判定为晚于的情况?是否需要先格式化再比较?

解决思路
  • 时间格式不匹配导致比较逻辑出错:
    前端new Date()生成的是带毫秒的ISO时间格式(如2023-08-03T12:10:33.195Z),而Laravel数据库中created_at存储的是带微秒的格式(如2023-08-03T11:56:32.000000Z)。直接将前端字符串传入SQL查询时,数据库的隐式格式转换会打乱时间比较的逻辑,导致错误结果。

  • 正确处理方式:

    1. 后端统一转换为Carbon实例:
      利用Laravel自带的Carbon类,将前端传入的时间字符串转换为标准时间对象,确保和数据库存储格式一致:

      use Carbon\Carbon;
      
      $lastTimeFocused = Carbon::parse($request->input('lastTimeFocused'));
      $newLikes = Like::where('liked_id', $request['user_id'])
                      ->where('created_at', '>', $lastTimeFocused)
                      ->get();
      

      Carbon会自动兼容不同格式的时间字符串,避免隐式转换带来的问题。

    2. 前端传递Unix时间戳:
      让前端直接传递毫秒级或秒级Unix时间戳,后端再转换为Carbon实例:
      前端代码示例:

      const lastTimeFocused = new Date().getTime(); // 获取毫秒级时间戳
      

      后端处理代码:

      $lastTimeFocused = Carbon::createFromTimestampMs($request->input('lastTimeFocused'));
      

内容的提问来源于stack exchange,提问作者gabogabans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:04:52