Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
function makeFriendlyDates(arr) {
var date=['1st','2nd','3rd','21st','22nd','23rd','31st'];
var month=['January','February','March','April','May','June','July','August','September','October','November','December'] ;
var startRange=arr[0].split('-');
var endRange=arr[1].split('-');
var everymonth2=[31,29,31,30,31,30,31,31,30,31,30,31]; //区分平年和闰年,为了以后计算是否在一年以内。
var everymonth1=[31,28,31,30,31,30,31,31,30,31,30,31];
var result=[];
var str;
var str2;
var middle;
var middle2;
function parse(arr) //用于将数组中的字符串转化成整形量。
{
for(var i=0;i<arr.length;i++)
{
arr[i]=parseInt(arr[i]);
}
}
function formatDay(day) //得到日期的要求格式
{
switch(day)
{
case 1:day=date[0];break;
case 2:day=date[1];break;
case 3:day=date[2];break;
case 21:day=date[3];break;
case 22:day=date[4];break;
case 23:day=date[5];break;
case 31:day=date[6];break;
default:day=day+'th';
}
return day;
}
function formatMonth(mon)//得到月份的要求格式。
{
for(var i=1;i<13;i++)
{
if(mon==i)
{
mon=month[i-1];
}
}
return mon;
}
function change(arr) //改变数组中的位置,来达到要求的排列。
{
var middle=arr[0];
arr.splice(0,1);
arr.push(middle);
}
function sumDay(arr1,arr2) //计算范围是否在一年之内。
{
var sum1=0;
var sum2=0;
function subsumDay(arr)
{
var sum=0;
if(arr[0]%4===0)
{
for(var i=0;i<arr[1]-1;i++)
{
sum+=everymonth2[i];
}
sum+=arr[2];
}
else{
for(var j=0;j<arr[1]-1;j++)
{
sum+=everymonth1[j];
}
sum+=arr[2];
}
return sum;
}
sum1=subsumDay(arr1);
if(arr1[0]%4===0)
{
sum2=(arr2[0]-arr1[0])*366+subsumDay(arr2);
}
else{
sum2=(arr2[0]-arr1[0])*365+subsumDay(arr2);
}
return sum2-sum1; //返回的是这个范围的天数
}
function currentYear(arr1,arr2) //当前年份是2016年且范围小于一年返回true
{
if(arr1[0]==2016)
{
if(sumDay(arr1,arr2)<365)
{
return true;
}
else{
return false;
}
}
else{
return false;
}
}
function sameYearMonth(arr1,arr2) //条件之一,同年同月
{
if(arr1[0]==arr2[0]&&arr1[1]==arr2[1])
{
return true;
}
else{
return false;
}
}
function format(arr1,arr2) //格式化的过程。
{
arr1[2]=formatDay(arr1[2]);
arr2[2]=formatDay(arr2[2]);
arr1[1]=formatMonth(arr1[1]);
arr2[1]=formatMonth(arr2[1]);
}
parse(startRange);
parse(endRange);
//如果日期范围是从当年(2016年)开始,并且在一年内(指的是365天这样的概念,而不是2016年这样的概念)结束,那么年份将不会被显示出来
if(startRange[0]==endRange[0]&&startRange[1]==endRange[1]&&startRange[2]==endRange[2]) //同一天的情况,不能使用startRange==endRange判断数组相等。
{
format(startRange,endRange);
change(startRange);
middle=startRange[2];
startRange.splice(2,1);
str=startRange.join(' ');
str=str.concat(', ',middle);
result.push(str);
return result;
}
if(sameYearMonth(startRange,endRange))
{
if(currentYear(startRange,endRange))
{
format(startRange,endRange);
startRange.splice(0,1);
endRange.splice(0,2);
str=startRange.join(' ');
result.push(str);
result.push(endRange[0]);
return result;
}
else{
format(startRange,endRange);
change(startRange);
middle=startRange[2];
startRange.splice(2,1);
str=startRange.join(' ');
str=str.concat(', ',middle);
result.push(str);
endRange.splice(0,2);
result.push(endRange[0]);
return result;
}
}
if(currentYear(startRange,endRange)) //makeFriendlyDates(["2016-12-01", "2017-02-03"]) should return ["December 1st","February 3rd"].
{
format(startRange,endRange);
change(startRange);
change(endRange);
startRange.splice(2,1);
endRange.splice(2,1);
str=startRange.join(' ');
str2=endRange.join(' ');
result.push(str,str2);
return result;
}
else if(sumDay(startRange,endRange)<365){
format(startRange,endRange);
change(startRange);
change(endRange);
endRange.splice(2,1);
middle=startRange[2];
startRange.splice(2,1);
str=startRange.join(' ');
str=str.concat(', ',middle);
str2=endRange.join(' ');
result.push(str,str2);
return result;
}
else{//一般的情况,范围超过一年,且当前年份非2016.
format(startRange,endRange);
change(startRange);
change(endRange);
//endRange.splice(2,1);
middle=startRange[2];
middle2=endRange[2];
startRange.splice(2,1);
endRange.splice(2,1);
str=startRange.join(' ');
str=str.concat(', ',middle);
str2=endRange.join(' ');
str2=str2.concat(', ',middle2);
result.push(str,str2);
return result;
}
}
makeFriendlyDates(['2022-09-05', '2023-09-06']);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment