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

思路:

就是几个条件判断一下就行了。写的有点繁琐,有更简便的请留言。

let makeFriendlyDates = arr => {
  const months = {"01" : "January","02" : "February","03" : "March", "04" : "April","05" : "May", "06" : "June", "07" : "July","08" : "August", "09" : "September","10" : "October", "11" : "November","12" : "December"  };
  let date1 = arr[0].split("-");
  let date2 = arr[1].split("-");
  let date = new Date();
  let dateChange = day => {
    if(day[0] === "0"){
      day = day.substr(1);
      if(day === "1") return day + "st";  //01->1st
      if(day === "2") return day + "nd";  //02->2nd
      if(day === "3") return day + "rd";  //03->3rd
      else return day + "th";
    }
    else{
      if(day.substr(1,1) === "1" && day.substr(0,1) === "2") return day + "st";  //21->21st
      if(day.substr(1,1) === "1" && day.substr(0,1) === "3") return day + "st";  //31->31st
      if(day.substr(1,1) === "2" && day.substr(0,1) === "2") return day + "nd";  //22->22nd
      if(day.substr(1,1) === "3" && day.substr(0,1) === "2") return day + "rd";  //23->23rd
      else return day + "th";
    }
  };
  let sameYear = (d1, d2) => {
    if(d2[0] - d1[0] > 1) return false;
    else{
      if(d1[0] === d2[0]) return true;
      else{  //判断相减为1的时候
        if(d2[1] > d1[1]) return false;
        if(d2[1] < d1[1]) return true; //判断在一年以内返回true
        else return d2[2] < d1[2] ? true : false; //判断是否在一年以内
      }
    }
  };
  if (sameYear(date1, date2)) {
    if(date1[0] === date2[0]){
      if(date1[1] === date2[1]){  //月份相同
        if(date1[2] === date2[2]){  //日期相同
          let dateArr = [];
          dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
          return dateArr;
        }
        else{
          let dateArr = [];
          dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
          dateArr.push(dateChange(date2[2]));
          return dateArr;
        }
      }
      else{  //月份不同
        let dateArr = [];
        dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
        dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
        return dateArr;
      }
    }
    if(date1[0] == date.getFullYear() - 1){  //开始年份为当前年份
      let dateArr = [];
      dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
      dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
      return dateArr;
    }
    else{
      let dateArr = [];
      dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
      dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
      return dateArr;
    }
  }
  if (date2[0] > date1[0]){  //不同年且d2比d1大时
    let dateArr = [];
    dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
    dateArr.push(months[date2[1]] + " " + dateChange(date2[2]) + ", " + date2[0]);
    return dateArr;
  }
}
makeFriendlyDates(["2017-02-05", "2017-03-03"]);

  

如果有不明白的地方请留言,如果有更好更简便更优化的方法请留言,谢谢。

更多内容请访问我的个人博客:Bblog

FCC(ES6写法) Friendly Date Ranges的更多相关文章

  1. js-FCC算法Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  2. Friendly Date Ranges 让日期区间更友好

    把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...

  3. Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  4. Friendly Date Ranges-freecodecamp算法题目

    Friendly Date Ranges 1.要求 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 ...

  5. React,React Native中的es5和es6写法对照

    es6用在React中的写法总结: 在es6还没有完全支持到浏览器的阶段里,已经有很多技术人员开始用es6的写法来超前编程了,因为有转义es6语法的工具帮助下,大家才可大量使用.解析看看es6写法用在 ...

  6. 6-最基础的服务-es6写法

    创建server.js 'use strict'; //http模块 var http = require('http'); //封装的方法 var handlers = require('./han ...

  7. react-native ES5与ES6写法对照表

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-es5-and-es6-writing-tabl ...

  8. 【转】React Native中ES5 ES6写法对照

    很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...

  9. JavaScript get set方法 ES5/ES6写法

    网上鲜有get和set的方法的实例,在这边再mark一下. get和set我个人理解本身只是一个语法糖,它定义的属性相当于“存储器属性” 为内部属性提供了一个方便习惯的读/写方式 ES5写法 func ...

随机推荐

  1. java常用类:1。包装类(以Integer类为例)2.String类 3.StringBuffer

     包装类 把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lang包中. Number 类 N ...

  2. W3CSchool闯关笔记(中级脚本算法)

    坚持下去,编程是一门艺术,与君共勉!!! function sumAll(arr) { var result = 0; var sn = Math.min(arr[0] , arr[1]); var ...

  3. swiper 逆向轮播

    在调用swiper的div上加dir="rtl"就行了,例子见下面链接 http://www.swiper.com.cn/demo/26-rtl.html <div clas ...

  4. UiAutomator2.0 - 获取同行控件

    目录 问题:UI测试时,在同一个界面出现相同的属性的控件(如图),对于这种控件的获取很是无奈.如果直接通过控件id去查找的话总是会返回界面该类型的第一个控件. 解决: 1.UiObject2 中已经给 ...

  5. 2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用

    一.原理与实践说明 1.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms08-067; (1分) 一个针对浏览器的攻 ...

  6. es6 let 和 const

    function test(){ let a = 1 for (let i =0;i<3;i++){ console.log(i)         //1,2 } console.log(i)  ...

  7. log4j配置,输出sql到控制台

    网上的 # Global logging configuration log4j.rootLogger=ERROR, stdout # log4j.logger后面跟着的是项目dao包路径,里面全部都 ...

  8. Fisher–Yates shuffle 洗牌算法

    Fisher-Yates shuffle 是一种生成有限序列的随机排列的算法--简单地说,该算法可以对序列进行混排.本人能力有限,且懒.不会扒论文去研究该算法在数学上的证明,只能抄袭网上的博客总结一遍 ...

  9. [转] webpack中配置Babel

    一.安装 npm install --save-dev babel-loader babel-core babel-preset-env 二.在webpack.config.js中配置module 1 ...

  10. 559. Maximum Depth of N-ary Tree

    https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ 非常简单的题目,连edge case 都没有.思路就是:最 ...