让日期区间更友好!
把常见的日期格式如: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
即可
重点:
- 小于一年 怎么判断
- 小于一年 结束年份不写
- 小于一年 结束日期与开始日期在同一月 (意思就是年月相同) 则 结束月份不写
- 小于一年 开始年份与当前年份相同(这题是2017年出的 好像没更新,所以在2018年做这题的直接把nowyear = 2017 就行 正确的当前年份应该是 now = new Date(); nowyear = now.getFullyear()) ,则开始年份不写
- 开始日期 与 结束日期完全相同 直接返回其中一个的时间就好
- 开始日期大于结束日期直接return
- 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; }