首页 > 代码库 > js-FCC算法Friendly Date Ranges

js-FCC算法Friendly Date Ranges

让日期区间更友好!

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

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

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

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

我的代码:

 1 function makeFriendlyDates(arr) {
 2   //获得目前的年份
 3   var yearnow=(new Date()).getFullYear();
 4   //把传入的参数放入字符串数组,创建Date类型也可以
 5   var date1=arr[0].split("-");
 6   var date2=arr[1].split("-");
 7   //月份的英文表示
 8   var months=["January","February","March","April","May","June","July","August","September","October","November","December"];
 9   //初始化几个后面用到的数组
10   var date1str="";
11   var date2str="";
12   var datearr=[];
13   //给日期加后缀的函数
14   function friendlydate(str){
15     var str2num=Number(str);
16     switch(str2num){
17       case 1:
18         str2num+="st";
19         break;
20       case 2:
21         str2num+="nd";
22         break;
23       case 3:
24         str2num+="rd";
25         break;
26       default:
27         str2num+="th";
28     }
29     return str2num;
30   }
31   //date1的字符串表示大部分情况下都是需要年月日的。date2的如果不是在同年同月,大部分情况下都是需要月日的
32   date1str=months[date1[1]-1]+" "+friendlydate(date1[2])+", "+date1[0];
33   if(date1[1]===date2[1]&&date1[0]===date2[0]){
34     date2str=friendlydate(date2[2]);
35   }else{
36     date2str=months[date2[1]-1]+" "+friendlydate(date2[2]);
37   }
38   //如果大于一年,date2加上年份;如果小于一年,而且date1的日期是今年,那么去掉date1的年份。
39   if((date2[0]-date1[0]>1)||((date2[0]-date1[0]===1)&&(date2[1]-date1[1]>0))||((date2[0]-date1[0]===1)&&(date2[1]-date1[1]===0)&&date2[2]-date1[2]>=0)){
40     date2str+=", "+date2[0];
41   }else if(date1[0]==yearnow){
42     date1str=date1str.slice(0,-6);
43   }
44   //把两个日期放在同一个数组里输出(如果是同年同月同日,代码里的date2str无用,所以代码是可以改善的)。
45   datearr[datearr.length]=date1str;
46   if(date1.toString()!==date2.toString()){
47     datearr[datearr.length]=date2str;
48   }
49   return datearr;
50 }

特殊情况下,date2str是没用的,有空改善一下。

js-FCC算法Friendly Date Ranges