优惠券有效期显示问题修复方案

137 阅读3分钟

问题描述

在房间预订页面的优惠券列表中,折扣券的有效期显示异常,显示为“1970/01/01”这样的无效日期。


问题分析

经过调试和分析,发现以下几个原因导致优惠券有效期显示异常:

  1. 日期处理逻辑缺失有效性验证:在获取优惠券有效期时,没有对日期进行有效性检查,导致无效日期被错误格式化。
  2. 无效日期处理不当:当优惠券的日期格式无效或为空时,直接进行格式化导致显示“1970/01/01”等默认日期。
  3. 特殊日期值未处理:如 1970/01/01 是 Unix 时间戳的起始时间,未进行过滤导致被错误地作为有效日期。

解决方案

为解决上述问题,修改 getAvailableCoupons 函数中的日期处理逻辑,确保每个优惠券的日期都经过严格验证,避免无效日期显示在页面上。

修改内容

  1. 日期有效性检查:在处理日期之前,首先检查日期是否有效。

  2. 处理 deadline 类型优惠券:需要判断 deadline 是否为有效日期。

  3. 处理 day_number 类型优惠券

    • 对于 day_number <= 0 的优惠券,检查 start_date 是否有效。
    • 对于 day_number > 0 的优惠券,检查 create_date 是否有效。
  4. 无效日期处理:对于所有无效日期(包括空日期、无效格式、1970年等特殊日期),统一显示为“永久有效”。

  5. 特殊日期过滤:如果日期为 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
}

核心修改点

  1. isValidDate()

    • 通过 Date.parse() 判断日期是否有效。
    • 排除掉 null、空字符串、以及 1970/01/01 等特殊日期。
  2. formatDate()

    • 使用 toISOString() 方法将日期格式化为 YYYY-MM-DD 格式。
  3. 优惠券类型检查

    • 针对 deadlineday_number 类型的优惠券进行不同的日期验证和处理。

改进效果

  1. 有效性验证:所有优惠券的有效期会在显示前经过严格的有效性验证,避免显示无效的 1970/01/01 日期。
  2. 清晰的日期格式:日期会统一格式化为 YYYY-MM-DD,提供一致的用户体验。
  3. “永久有效”处理:无效日期和特殊日期会被统一替换为“永久有效”,确保页面显示更清晰。
  4. 提高系统稳定性:通过日期有效性检查,避免了潜在的错误或崩溃,提升了系统的鲁棒性。

总结

通过对优惠券有效期的日期处理逻辑进行优化,确保了日期的有效性和格式的统一。无效日期会被正确地过滤和处理,从而提升了用户体验,避免了历史遗留问题(如显示 1970/01/01)。