问题描述
在房间预订页面的优惠券列表中,折扣券的有效期显示异常,显示为“1970/01/01”这样的无效日期。
问题分析
经过调试和分析,发现以下几个原因导致优惠券有效期显示异常:
- 日期处理逻辑缺失有效性验证:在获取优惠券有效期时,没有对日期进行有效性检查,导致无效日期被错误格式化。
- 无效日期处理不当:当优惠券的日期格式无效或为空时,直接进行格式化导致显示“1970/01/01”等默认日期。
- 特殊日期值未处理:如
1970/01/01是 Unix 时间戳的起始时间,未进行过滤导致被错误地作为有效日期。
解决方案
为解决上述问题,修改 getAvailableCoupons 函数中的日期处理逻辑,确保每个优惠券的日期都经过严格验证,避免无效日期显示在页面上。
修改内容:
-
日期有效性检查:在处理日期之前,首先检查日期是否有效。
-
处理 deadline 类型优惠券:需要判断
deadline是否为有效日期。 -
处理 day_number 类型优惠券:
- 对于
day_number <= 0的优惠券,检查start_date是否有效。 - 对于
day_number > 0的优惠券,检查create_date是否有效。
- 对于
-
无效日期处理:对于所有无效日期(包括空日期、无效格式、1970年等特殊日期),统一显示为“永久有效”。
-
特殊日期过滤:如果日期为
1970/01/01,直接返回“永久有效”文本。
具体实现
function getAvailableCoupons(coupons: Coupon[]) {
return coupons.map(coupon => {
let validDate: string;
if (coupon.type === "deadline") {
// 判断 deadline 是否为有效日期
validDate = isValidDate(coupon.deadline) ? formatDate(coupon.deadline) : "永久有效";
} else if (coupon.type === "day_number") {
// 判断 day_number 类型优惠券的日期有效性
if (coupon.day_number <= 0) {
validDate = isValidDate(coupon.start_date) ? formatDate(coupon.start_date) : "永久有效";
} else {
validDate = isValidDate(coupon.create_date) ? formatDate(coupon.create_date) : "永久有效";
}
} else {
validDate = "永久有效";
}
return { ...coupon, validDate };
});
}
// 判断日期是否有效
function isValidDate(date: any): boolean {
return !isNaN(Date.parse(date)) && date !== null && date !== "" && new Date(date).getFullYear() > 1970;
}
// 日期格式化函数
function formatDate(date: string): string {
const d = new Date(date);
return d.toISOString().split('T')[0]; // 格式化为 YYYY-MM-DD
}
核心修改点:
-
isValidDate() :
- 通过
Date.parse()判断日期是否有效。 - 排除掉
null、空字符串、以及1970/01/01等特殊日期。
- 通过
-
formatDate() :
- 使用
toISOString()方法将日期格式化为YYYY-MM-DD格式。
- 使用
-
优惠券类型检查:
- 针对
deadline和day_number类型的优惠券进行不同的日期验证和处理。
- 针对
改进效果
- 有效性验证:所有优惠券的有效期会在显示前经过严格的有效性验证,避免显示无效的
1970/01/01日期。 - 清晰的日期格式:日期会统一格式化为
YYYY-MM-DD,提供一致的用户体验。 - “永久有效”处理:无效日期和特殊日期会被统一替换为“永久有效”,确保页面显示更清晰。
- 提高系统稳定性:通过日期有效性检查,避免了潜在的错误或崩溃,提升了系统的鲁棒性。
总结
通过对优惠券有效期的日期处理逻辑进行优化,确保了日期的有效性和格式的统一。无效日期会被正确地过滤和处理,从而提升了用户体验,避免了历史遗留问题(如显示 1970/01/01)。