Friendly Date Ranges (FCC高级算法)

让日期区间更友好!

把常见的日期格式如: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 即可

 

重点:

  1.  小于一年 怎么判断
  2.  小于一年 结束年份不写
  3.  小于一年  结束日期与开始日期在同一月  (意思就是年月相同)   则  结束月份不写
  4.  小于一年  开始年份与当前年份相同(这题是2017年出的   好像没更新,所以在2018年做这题的直接把nowyear = 2017 就行    正确的当前年份应该是  now = new Date();  nowyear = now.getFullyear()) ,则开始年份不写
  5.  开始日期 与 结束日期完全相同  直接返回其中一个的时间就好
  6.  开始日期大于结束日期直接return
  7.  st nd rd th 后缀   ,  带数字 1 , 2 ,3  ,不包括11, 12 ,13  ,分别是 st ,rd ,nd  。 其他全部是th后缀

代码如下:

function makeFriendlyDates(arr) {
    var months = ["January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September ", "October ", "November ", "December ",];
  var arrs = [];
//给哪一天加后缀
  function day(val){
    if(val%10 == 1 && val != 11)return val+"st";
    else if(val%10 == 2 && val != 12)return val+"nd";
    else if(val%10 == 3 && val != 13)return val+"rd";
    else return val+"th";
  }
  var start = new Date(arr[0].replace(/-/g , "/")); //创建一个开始日期的对象
  var  over= new Date(arr[1].replace(/-/g , "/")); //创建一个结束日期的对象
  var nowyear = 2017; //现在的年份
  var stmon = start.getMonth();//开始月
  var stdate = start.getDate();//开始日
  var styear = start.getFullYear();//开始年
  var ovmon = over.getMonth();//结束月
  var ovdate = over.getDate();//结束日
  var ovyear = over.getFullYear();//结束年
  if(start.getTime() > over.getTime()) return;  // 开始日期大于结束日期  返回 undifine
//判断小于一年的函数  小于一年返回true 反之
    function differ() {
        let data = new Date(arr[1].replace(/-/g, "/")); //一个中间对象   结束日期的对象
        data.setFullYear(data.getFullYear() - 1); // 结束日期年份减一年   
        if(data.getTime() > start.getTime()) { //如果结束日期减掉一年还是比开始日期大  就说明开始日期小于结束日期大于一年
            return false;
        }
        else {
            return true;
        }
    }
  var bool = differ(); //bool 为true就是小于一年  否则
  
  if(start.getTime() === over.getTime()){      //如果日期完全相同,则返回开始或者结束日期
      return [months[stmon]+day(stdate)+ ", "+styear];
  }
  arrs[0] = months[stmon]+day(stdate);   //返回的开始年份   月 +日   不需要判断    按照返回顺序先判断月在判断年    所以下面的判断都是这个顺序
  if(bool){
          if(nowyear != styear)arrs[0] = arrs[0] + ", "+ styear;     //小于一年  当前年 不等于开始年  写上开始年份
          if(ovmon == stmon && styear == ovyear)arrs[1] = day(ovdate);   // 小于一年   开始月=结束月 开始年=结束年   结束月不写
            else arrs[1] = months[ovmon] + day(ovdate);    // 小于一年    否则   结束月写上
    if(ovmon == stmon && ovdate == stdate)arrs[1] = arrs[1] + ", "+ ovyear;
  }
    else {
          arrs[0] = arrs[0] + ", "+ styear;      //大于一年  写上开始年
          arrs[1] = months[ovmon] + day(ovdate); //大于一年  写上结束月
          arrs[1] = arrs[1] + ", "+ ovyear;      //大于一年  写上结束年
 }
  return arrs;
}

 

 

第二种判断小于一年的方法  ,其它大致一样    ,我就不一一加注释了  (这种方法是一个帮助我的大大提出来的   很不错)

function makeFriendlyDates(arr) {
    var months = [" ","January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September ", "October ", "November ", "December ",];
  var arrs = [];
  var stmon,stdate,styear,ovmon,ovdate,ovyear,start,over;
//给哪一天加后缀
  function day(val){
    if(val%10 == 1 && val != 11)return val+"st";
    else if(val%10 == 2 && val != 12)return val+"nd";
    else if(val%10 == 3 && val != 13)return val+"rd";
    else return val+"th";
  }
     arr = arr.map(function(item){
       return item.split("-");
     });
     arr.forEach(function(item , index){
               item.forEach(function(item1 ,index1){
                  switch(index1+index*3){
                      case 0: styear= parseInt(item1);break;
                      case 1: stmon= parseInt(item1);break;
                      case 2: stdate= parseInt(item1);break;
                      case 3: ovyear= parseInt(item1);break;
                      case 4: ovmon= parseInt(item1);break;
                      case 5: ovdate= parseInt(item1);break;
                  }
          });
       if(index == 0){
           start = parseInt(item.reduce(function(a, b) {   //如2017-10-11   start = 20171011;
               return a.concat(b);
           }));
       }
       else {
               over = parseInt(item.reduce(function(a, b) {
               return a.concat(b);
           }));
       }
     });
  var nowyear = 2017; //现在的年份
  if(start > over) return;  // 开始日期大于结束日期  返回 undifine
//判断小于一年的函数  小于一年返回true 反之
  var bool = (over - start) <= 10000;
  if(start === over){
      return [months[stmon]+day(stdate)+ ", "+styear];
  }
  arrs[0] = months[stmon]+day(stdate);   //返回的开始年份   月 +日   不需要判断
  if(bool){
          if(nowyear != styear)arrs[0] = arrs[0] + ", "+ styear;
          if(ovmon == stmon && styear == ovyear)arrs[1] = day(ovdate);
            else arrs[1] = months[ovmon] + day(ovdate);
            if(ovmon == stmon && ovdate == stdate)arrs[1] = arrs[1] + ", "+ ovyear;
  }
    else {
          arrs[0] = arrs[0] + ", "+ styear;
          arrs[1] = months[ovmon] + day(ovdate);
          arrs[1] = arrs[1] + ", "+ ovyear;
 }
  return arrs;
}

 

posted on 2018-01-11 10:14  辣条菌的思维屋i  阅读(224)  评论(0编辑  收藏  举报