Question 2. 万年历问题
输入年份、月份、日期,计算下一天的日期

算法思想

首先校验输入的日期,确定其符合规范后,再结合各种现实约束,计算下一天的日期。

代码实现

function calendarProblem(year: number, month: number, day: number): string {
  if (year < 1900 || year > 2100) {
    return "年份数值越界"
  }

  if (month <= 0 || month > 12) {
    return "月份数值越界"
  }

  const monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as const
  let isLeap = 0

  if (year % 400 == 0) {
    isLeap = 1
  } else if (year % 100 != 0 && year % 4 == 0) {
    isLeap = 1;
  }

  monthDays[1] += isLeap
  const maxDays = monthDays[month - 1]

  if (day <= 0 || day > maxDays) {
    return "日期数值越界"
  }

  const result = [year, month, day + 1] as const

  if (day == maxDays) {
    result[2] = 1
    result[1]++
  }

  if (result[1] > 12) {
    result[1] = 1
    result[0]++
  }

  return result[0] + "/" + result[1] + "/" + result[2]
}