freeCodeCamp

Friendly Date Ranges

2017-11-02  本文已影响0人  Awoooo

让日期区间更友好!

把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式。

易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1).

记住不要显示那些可以被推测出来的信息: 如果一个日期区间里结束日期与开始日期相差小于一年,则结束日期就不用写年份了;在这种情况下,如果月份开始和结束日期如果在同一个月,则结束日期月份也不用写了。

另外, 如果开始日期年份是当前年份,且结束日期与开始日期小于一年,则开始日期的年份也不用写。

例如:

包含当前年份和相同月份的时候,makeFriendlyDates(["2017-01-02", "2017-01-05"]) 应该返回 ["January 2nd","5th"]

不包含当前年份,makeFriendlyDates(["2003-08-15", "2009-09-21"]) 应该返回 ["August 15th, 2003", "September 21st, 2009"]。

请考虑清楚所有可能出现的情况,包括传入的日期区间是否合理。对于不合理的日期区间,直接返回 undefined 即可

复杂的逻辑判断,如何简化判断条件是关键。

function makeFriendlyDates(arr) {
  var currYear = new Date().getFullYear();

  var startDate = arr[0].split('-');
  var endDate = arr[1].split('-');
  // 开始时间和结束时间的时间差
  var long = +endDate.join('') - +startDate.join('');
  // YYYYMMDD格式开始时间和结束时间一年的差
  var A_YEAR = 10000;
  
  // 根据条件归并日期
  if (long > 0 && long < A_YEAR) {
    if (+startDate[0] === currYear) {
      startDate.splice(0, 1);
      if (startDate[0] === endDate[1]) {
        endDate.splice(1, 1);
      }
    }
    endDate.splice(0, 1);
  } else if (long < 0) {
    return;
  } else if (long === 0) {
    return format(startDate);
  }
  // 返回更易读的格式
  return format(startDate).concat(format(endDate));
}

var month = ['January', 'February', 'March', 'April', 'May', 'June',
  'July', 'August', 'September', 'October', 'November', 'December'];

// 任意时间数组的格式化函数
function format (arr) {
  var length = arr.length;
  if (length === 1) {
    return [addEnding(+arr[0])];
  }
  if (length === 2) {
    var monthIndex = arr[0] - 1;
    var day = +arr[1];
    return [month[monthIndex] + ' ' + addEnding(day)];
  }
  if (length === 3) {
    return toFormat(arr);
  }
}

// 有年月日完整数组的格式化函数
function toFormat (arr) {
  var year = arr[0];
  var monthIndex = arr[1] - 1;
  var day = +arr[2];
  return [month[monthIndex] + ' ' + addEnding(day) + ', ' + year];
}

// 在日期后添加后缀的格式化函数
function addEnding(day) {
  var ending = ['th', 'st', 'nd', 'rd'];
  if (day % 10 < 4 && day !== 11 && day !== 12 && day !== 13) {
    return day + ending[day % 10];
  } else {
    return day + 'th';
  }
}

makeFriendlyDates(["2017-07-12", "2018-06-13"]);
上一篇下一篇

猜你喜欢

热点阅读