Laravel时间区间验证怎么写

wen PHP项目 1

本文目录导读:

Laravel时间区间验证怎么写

  1. 验证两个日期字段的先后顺序
  2. 验证时间间隔不超过指定时长
  3. 验证时间格式和时间范围(纯时间)
  4. 使用 beforeafter 与当前时间比较
  5. 验证两个时间字段的区间(使用 between
  6. 验证日期区间可用性(数据库查询)
  7. 常用规则速查表

在 Laravel 中,验证时间区间有多种写法,具体取决于你是验证日期时间还是纯时间,以及你的业务需求。

以下是几种常见的场景及对应验证规则:

验证两个日期字段的先后顺序

这是最常见的场景,例如验证 start_date 必须早于或等于 end_date

use Illuminate\Support\Facades\Validator;
$data = [
    'start_date' => '2023-01-01',
    'end_date'   => '2023-01-10',
];
$rules = [
    'start_date' => 'required|date',
    'end_date'   => 'required|date|after_or_equal:start_date',
];
$validator = Validator::make($data, $rules);
if ($validator->fails()) {
    // 处理错误
}
  • after:start_date:必须晚于 start_date
  • after_or_equal:start_date:必须晚于或等于 start_date (常用)

验证时间间隔不超过指定时长

结束时间不能比开始时间晚超过 7 天。

$rules = [
    'start_date' => 'required|date',
    'end_date'   => [
        'required',
        'date',
        'after_or_equal:start_date',
        function ($attribute, $value, $fail) use ($data) {
            $start = strtotime($data['start_date']);
            $end = strtotime($value);
            $diffDays = ($end - $start) / (60 * 60 * 24);
            if ($diffDays > 7) {
                $fail('时间区间不能超过 7 天。');
            }
        },
    ],
];

验证时间格式和时间范围(纯时间)

验证 time 字段在 08:00 到 18:00 之间。

$rules = [
    'time' => [
        'required',
        'date_format:H:i',
        function ($attribute, $value, $fail) {
            $time = strtotime($value);
            $start = strtotime('08:00');
            $end = strtotime('18:00');
            if ($time < $start || $time > $end) {
                $fail('时间必须在 08:00 到 18:00 之间。');
            }
        },
    ],
];

使用 beforeafter 与当前时间比较

验证日期必须在今天之前或之后。

$rules = [
    'event_date' => 'required|date|after:today', // 必须是今天之后的日期
];
$rules = [
    'birthday' => 'required|date|before:today', // 必须是今天之前的日期
];
$rules = [
    'meeting_time' => 'required|date|after:now', // 必须是当前时间之后
];

验证两个时间字段的区间(使用 between

如果你的字段本身就是时间戳,可以直接用 numeric 比较。

$rules = [
    'start_time' => 'required|numeric',
    'end_time'   => 'required|numeric|gt:start_time|lt:'.(time() + 3600), // 小于当前时间+1小时
];

验证日期区间可用性(数据库查询)

预订系统验证一个时间区间是否已被占用:

$rules = [
    'start_date' => 'required|date',
    'end_date'   => 'required|date|after:start_date',
];
// 额外业务逻辑验证
$validator->after(function ($validator) use ($request) {
    $exists = Booking::where(function ($query) use ($request) {
        $query->whereBetween('start_date', [$request->start_date, $request->end_date])
              ->orWhereBetween('end_date', [$request->start_date, $request->end_date]);
    })->exists();
    if ($exists) {
        $validator->errors()->add('date_range', '该时间段已被占用。');
    }
});

常用规则速查表

验证场景 规则写法
开始日期 ≤ 结束日期 after_or_equal:start_date
日期必须大于今天 after:today
日期必须小于今天 before:today
时间格式验证 date_format:H:i:s
自定义时间范围 闭包或自定义规则
两个日期相差不超过 N 天 闭包 + strtotime 计算差值
时间区间不冲突 自定义验证器 + 数据库查询

如果你能提供更具体的业务场景(如预订系统、活动报名、时间表等),我可以给出更精准的示例。

抱歉,评论功能暂时关闭!