Friendly Date Ranges 让日期区间更友好

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

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

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

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

function makeFriendlyDates(arr) {   //当前年份2017
  var arr1 = arr[0].split("-"); var arr2 = arr[1].split("-");var month = {                   //月份
    "01":"January", "02":"February", "03":"March", "04":"April", "05":"May", "06":"June", "07":"July", "08":"August", "09":"September", "10":"October", "11":"November", "12":"December" }; function getDay(day){      //日期结尾
    if(day == "1" || day == "21" || day == "31"){ return "st"; }else if(day == "2" || day == "22"){ return "nd"; }else if(day == "3" || day == "23"){ return "rd"; }else { return "th"; } } function getD(day){          //将0一、02等改成一、2等 添加结尾
    var n; if(day / 10 < 1){ n = day % 10; }else{ n = day; } return n + getDay(n); } function getDa(year, mon, day){        //拼接
    var dArr; if(!mon && !year){ dArr = getD(day); }else if(!year){ dArr = month[mon] +" " + getD(day); }else{ dArr = month[mon] +" " + getD(day)+ ", " + year; } return dArr; } var cha = arr2.join("") - arr1.join(""); if(cha < 0){               //不合理
    return undefined; }else if(cha > 0){        //不是同一天
    if(cha < 10000){             //相差1年之内
      if(arr1[0] == 2017){            //1年之内且开始年份为当前年份
        if(arr1[1] == arr2[1]){            //月份相同 
          return [getDa("", arr1[1], arr1[2]), getDa("", "", arr2[2])]; }else{                             //月份不一样
          return [getDa("", arr1[1], arr1[2]), getDa("", arr2[1], arr2[2])]; } }else{                          //1年之内且开始年份非当前年份
        return [getDa(arr1[0], arr1[1], arr1[2]), getDa("", arr2[1], arr2[2])]; } }else{                       //相差大于1年
      return [getDa(arr1[0], arr1[1], arr1[2]), getDa(arr2[0], arr2[1], arr2[2])]; } }else{                  //是同一天
    return [getDa(arr1[0], arr1[1], arr1[2])]; } } makeFriendlyDates(["2001-12-20", "2001-12-20"]);