让日期区间更友好!
把常见的日期格式如:
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是没用的,有空改善一下。