代码之家  ›  专栏  ›  技术社区  ›  Jesse Orange

在一天结束的时候,用雄辩和碳在拉瓦维尔结束争吵

  •  1
  • Jesse Orange  · 技术社区  · 6 年前

    我有一份工作应该在 expires_on 列。

    因此,如果到期日是2018年11月5日,那么工作应该在该日的11:59到期。

    我现在的问题是:

    $job_posts = JobPost::where('expires_on', '<', Carbon::now())
        ->where('status', '<>', 'Closed')
        ->get();
    

    但是,此查询将在午夜(00:00)关闭作业,因为这实际上是当天的开始,我希望它在指定日期的结束而不是开始时关闭。

    这样做是否更正确:

    $job_posts = JobPost::where('expires_on', '<', Carbon::now())
        ->addDay(1))
        ->where('status', '<>', 'Closed')
        ->get();
    

    或者:

    $job_posts = JobPost::where('expires_on', '<', Carbon::now())
        ->endOfDay())
        ->where('status', '<>', 'Closed')
        ->get();
    

    更新

    我把字段expires改为 datetime 在我的模型中,我创建了一个mutator,它总是将关闭时间设置为23:59:59,如下所示:

    /**
     * Set the expiry date to always be 11:59PM on the given day
     *
     * @param string $value
     * @return void
     */
    public function setExpiresOnAttribute($value)
    {
        $this->attributes['expires_on'] = Carbon::parse($value)->endOfDay();
    }
    

    这意味着我的原始代码,理论上应该做这个工作,因为工作到期时间不再是午夜(00:00:00)

    2 回复  |  直到 6 年前
        1
  •  3
  •   Mike Doe Backs    6 年前

    检查日期是否小于“明天”:

    $job_posts = JobPost::where('expires_on','<', Carbon::tomorrow())
        ->where('status', '<>', 'Closed')
        ->get();
    

    事实上,不到明天是昨天的最后一秒。这和你最后两个例子完全一样。

        2
  •  0
  •   ako    6 年前

    使用 setTimeFromTimeString 函数将指定时间添加到 now :

    查看函数的结果:

    dd([Carbon::now(), Carbon::now()->setTimeFromTimeString("23:59")]);
    

    输出为:

    Carbon @1541421688 {#1418 ▼
      date: 2018-11-05 16:11:28.810618 Asia/Tehran (+03:30)
    }
    Carbon @1541449740 {#1420 ▼
      date: 2018-11-05 23:59:00.0 Asia/Tehran (+03:30)
    }
    

    因此,在查询中,可以使用以下函数:

    $job_posts = JobPost::where('expires_on', '<', Carbon::now()->setTimeFromTimeString("23:59"))
        ->where('status', '<>', 'Closed')
        ->get();
    
    推荐文章