本文目录导读:

- 验证两个日期字段的先后顺序
- 验证时间间隔不超过指定时长
- 验证时间格式和时间范围(纯时间)
- 使用
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 计算差值 |
| 时间区间不冲突 | 自定义验证器 + 数据库查询 |
如果你能提供更具体的业务场景(如预订系统、活动报名、时间表等),我可以给出更精准的示例。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播