本文目录导读:

- 验证两个日期字段的先后顺序
- 验证时间间隔不超过指定时长
- 验证时间格式和时间范围(纯时间)
- 使用
before和after与当前时间比较 - 验证两个时间字段的区间(使用
between) - 验证日期区间可用性(数据库查询)
- 常用规则速查表
在 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_dateafter_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 之间。');
}
},
],
];
使用 before 和 after 与当前时间比较
验证日期必须在今天之前或之后。
$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 计算差值 |
| 时间区间不冲突 | 自定义验证器 + 数据库查询 |
如果你能提供更具体的业务场景(如预订系统、活动报名、时间表等),我可以给出更精准的示例。