Friendly Date Ranges
2017-11-02 本文已影响0人
Awoooo
让日期区间更友好!
把常见的日期格式如: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 即可
复杂的逻辑判断,如何简化判断条件是关键。
function makeFriendlyDates(arr) {
var currYear = new Date().getFullYear();
var startDate = arr[0].split('-');
var endDate = arr[1].split('-');
// 开始时间和结束时间的时间差
var long = +endDate.join('') - +startDate.join('');
// YYYYMMDD格式开始时间和结束时间一年的差
var A_YEAR = 10000;
// 根据条件归并日期
if (long > 0 && long < A_YEAR) {
if (+startDate[0] === currYear) {
startDate.splice(0, 1);
if (startDate[0] === endDate[1]) {
endDate.splice(1, 1);
}
}
endDate.splice(0, 1);
} else if (long < 0) {
return;
} else if (long === 0) {
return format(startDate);
}
// 返回更易读的格式
return format(startDate).concat(format(endDate));
}
var month = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
// 任意时间数组的格式化函数
function format (arr) {
var length = arr.length;
if (length === 1) {
return [addEnding(+arr[0])];
}
if (length === 2) {
var monthIndex = arr[0] - 1;
var day = +arr[1];
return [month[monthIndex] + ' ' + addEnding(day)];
}
if (length === 3) {
return toFormat(arr);
}
}
// 有年月日完整数组的格式化函数
function toFormat (arr) {
var year = arr[0];
var monthIndex = arr[1] - 1;
var day = +arr[2];
return [month[monthIndex] + ' ' + addEnding(day) + ', ' + year];
}
// 在日期后添加后缀的格式化函数
function addEnding(day) {
var ending = ['th', 'st', 'nd', 'rd'];
if (day % 10 < 4 && day !== 11 && day !== 12 && day !== 13) {
return day + ending[day % 10];
} else {
return day + 'th';
}
}
makeFriendlyDates(["2017-07-12", "2018-06-13"]);