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是没用的,有空改善一下。

时间: 2024-10-14 12:10:50

js-FCC算法Friendly Date Ranges的相关文章

Friendly Date Ranges

让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果一个日期区间里结束日期与开始日期相差小于一年,则结束日期就不用写年份了:在这种情况下,如果月份开始和结束日期如果在同一个月,则结束日期月份也不用写了. 另外, 如果开始日期年份是当前年份,且结束日期与开始日期小于一年,则开始日期的年份也不用写. 例如: 包含当前年份和相同月份的时

js中String转Date类型并比较大小

1.比较常用的方法,但繁琐: 主要使用Date的构造方法:Date(int year , int month , int day) Java代码   <script> var str1 = "2009-8-9"; var arr1 = str1.split("-"); var date1 = new Date(arr1[0],parseInt(arr1[1])-1,arr1[2]); var str2 = "2009-8-4"; va

js排序算法

利用js来实现一些常见的排序算法,在面试中问得还是挺多的,下面我就其进行了简单的总结. sort()方法 首先要讲讲JS数组排序的sort方法,它实现的原理是通过两两比较的方法,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值位于最后面,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort方法比较的也是字符串.因此有必要定义一个比较函数: function compare(value1,value2)

JS经典算法

JS经典算法: // 1.字符串颠倒 str.split('').reverse().join('') // 2.不借助中间量,颠倒a.b a=[b,b=a][0] // 3.快速获取数组的最大值.最小值 Array.prototype.max = function () { return Math.max.apply(null, this) } Array.prototype.min = function () { return Math.min.apply(null, this) } //

FCC之JS基础算法总结1

1.翻转字符串 解决思路:先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 1 function reverseString(str) { 2 var arr = []; 3 arr = str.split(""); 4 arr.reverse(); 5 str = arr.join(""); 6 return str; 7 } 8 9 reverseString("hello"); 主要是对String

FCC JS基础算法题(2):Check for Palindromes(检查回文字符串)

题目描述: 如果给定的字符串是回文,返回true,反之,返回false.如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文).注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文.函数参数的值可以为"racecar","RaceCar"和"race CAR". 算法: function palindrome(str) { var str_obj = s

FCC JS基础算法题(0):Reverse a String(翻转字符串)

题目描述: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串.你的结果必须得是一个字符串. 算法: function reverseString(str) { // 请把你的代码写在这里 str = str.split("").reverse().join(""); return str; } reverseString("hello"); 原文地址:https://www.cnblogs.com/hume

FCC JS基础算法题(1):Factorialize a Number(计算一个整数的阶乘)

题目描述: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积.阶乘通常简写成 n!例如: 5! = 1 * 2 * 3 * 4 * 5 = 120. 算法: function factorialize(num) { // 请把你的代码写在这里 var result = 1; for(var i=2;i <= num;i++){ result *= i; } return result; } factorialize(1); 原文地址:https://www.cnblogs.co

FCC JS基础算法题(8):Slasher Flick(截断数组)

题目描述: 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这个题目有两个方法,都比较简单,用slice方法: function slasher(arr, howMany) { // 请把你的代码写在这里 var newArr = []; newArr = arr.slice(howMany); return newArr; } slasher([1, 2, 3], 2); 然后是用splice方法: function slasher(arr, howMany) { // 请把你的