在Angular应用开发中,处理日期数据是非常常见的任务。当业务逻辑要求判断一个日期数组中是否包含连续日期时,我们可以通过排序与遍历差值的方式来实现稳定且易读的验证方法。

为什么需要验证连续日期
连续日期通常指时间上相邻、相差正好一天的日期,例如 2023-10-01 与 2023-10-02。在排班系统、签到统计等场景中,确认数组中是否存在这样的日期对,是后续计算连续天数或预警断签的基础。
核心实现思路
我们可以按以下步骤进行处理:
- 将日期数组中的每一项转为时间戳或标准 Date 对象
- 对数组进行升序排序,避免顺序错乱导致误判
- 遍历排序后的数组,比较相邻两项的时间差是否为 24 小时(即 86400000 毫秒)
- 只要发现一对相邻日期相差一天,即可判定存在连续日期
TypeScript 验证函数示例
下面给出一个可在 Angular 服务或组件中直接使用的工具函数:
// 验证日期数组中是否存在连续日期
function hasConsecutiveDates(dateArray: string[]): boolean {
// 将字符串日期转为时间戳并排序
const timestamps: number[] = dateArray
.map(item => new Date(item).getTime())
.sort((a, b) => a - b);
const ONE_DAY: number = 24 * 60 * 60 * 1000;
for (let i = 0; i < timestamps.length - 1; i++) {
// 判断相邻两项差值是否正好为一天
if (timestamps[i + 1] - timestamps[i] === ONE_DAY) {
return true;
}
}
return false;
}
// 使用示例
const dates: string[] = ['2023-10-03', '2023-10-01', '2023-10-02'];
console.log(hasConsecutiveDates(dates)); // 输出 true
在 Angular 组件中使用
你可以将上面的函数放在一个独立工具文件,或写在组件类里。比如:
import { Component } from '@angular/core';
@Component({
selector: 'app-date-check',
template: '<p>是否存在连续日期:{{ result }}</p>'
})
export class DateCheckComponent {
result: boolean;
constructor() {
const input: string[] = ['2023-11-05', '2023-11-07'];
this.result = hasConsecutiveDates(input);
}
}
function hasConsecutiveDates(dateArray: string[]): boolean {
const ts = dateArray.map(d => new Date(d).getTime()).sort((a, b) => a - b);
const day = 86400000;
for (let i = 0; i < ts.length - 1; i++) {
if (ts[i + 1] - ts[i] === day) return true;
}
return false;
}
注意事项
如果日期包含具体时间,直接比较毫秒差可能受小时分钟影响。此时建议先使用 setHours(0,0,0,0) 抹平时间部分再计算。另外,重复日期不会被视为连续,业务上如需合并去重可先使用 Set 处理。
连续日期验证本质是一个排序加线性扫描的过程,时间复杂度为 O(n log n),适合绝大多数前端数据规模。
小结
通过上述方法,我们能在 Angular 中快速验证日期数组是否含有连续日期。代码逻辑清晰,不依赖第三方库,方便根据项目需要进一步扩展为获取连续区间或统计最长连续天数等功能。