FCC(ES6写法) Friendly Date Ranges
把常见的日期格式如: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 即可。
思路:
就是几个条件判断一下就行了。写的有点繁琐,有更简便的请留言。
let makeFriendlyDates = arr => {
const months = {"01" : "January","02" : "February","03" : "March", "04" : "April","05" : "May", "06" : "June", "07" : "July","08" : "August", "09" : "September","10" : "October", "11" : "November","12" : "December" };
let date1 = arr[0].split("-");
let date2 = arr[1].split("-");
let date = new Date();
let dateChange = day => {
if(day[0] === "0"){
day = day.substr(1);
if(day === "1") return day + "st"; //01->1st
if(day === "2") return day + "nd"; //02->2nd
if(day === "3") return day + "rd"; //03->3rd
else return day + "th";
}
else{
if(day.substr(1,1) === "1" && day.substr(0,1) === "2") return day + "st"; //21->21st
if(day.substr(1,1) === "1" && day.substr(0,1) === "3") return day + "st"; //31->31st
if(day.substr(1,1) === "2" && day.substr(0,1) === "2") return day + "nd"; //22->22nd
if(day.substr(1,1) === "3" && day.substr(0,1) === "2") return day + "rd"; //23->23rd
else return day + "th";
}
};
let sameYear = (d1, d2) => {
if(d2[0] - d1[0] > 1) return false;
else{
if(d1[0] === d2[0]) return true;
else{ //判断相减为1的时候
if(d2[1] > d1[1]) return false;
if(d2[1] < d1[1]) return true; //判断在一年以内返回true
else return d2[2] < d1[2] ? true : false; //判断是否在一年以内
}
}
};
if (sameYear(date1, date2)) {
if(date1[0] === date2[0]){
if(date1[1] === date2[1]){ //月份相同
if(date1[2] === date2[2]){ //日期相同
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
return dateArr;
}
else{
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
dateArr.push(dateChange(date2[2]));
return dateArr;
}
}
else{ //月份不同
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
return dateArr;
}
}
if(date1[0] == date.getFullYear() - 1){ //开始年份为当前年份
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));
dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
return dateArr;
}
else{
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));
return dateArr;
}
}
if (date2[0] > date1[0]){ //不同年且d2比d1大时
let dateArr = [];
dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);
dateArr.push(months[date2[1]] + " " + dateChange(date2[2]) + ", " + date2[0]);
return dateArr;
}
}
makeFriendlyDates(["2017-02-05", "2017-03-03"]);
如果有不明白的地方请留言,如果有更好更简便更优化的方法请留言,谢谢。
更多内容请访问我的个人博客:Bblog
FCC(ES6写法) Friendly Date Ranges的更多相关文章
- js-FCC算法Friendly Date Ranges
让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...
- Friendly Date Ranges 让日期区间更友好
把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...
- Friendly Date Ranges
让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...
- Friendly Date Ranges-freecodecamp算法题目
Friendly Date Ranges 1.要求 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 ...
- React,React Native中的es5和es6写法对照
es6用在React中的写法总结: 在es6还没有完全支持到浏览器的阶段里,已经有很多技术人员开始用es6的写法来超前编程了,因为有转义es6语法的工具帮助下,大家才可大量使用.解析看看es6写法用在 ...
- 6-最基础的服务-es6写法
创建server.js 'use strict'; //http模块 var http = require('http'); //封装的方法 var handlers = require('./han ...
- react-native ES5与ES6写法对照表
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-es5-and-es6-writing-tabl ...
- 【转】React Native中ES5 ES6写法对照
很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...
- JavaScript get set方法 ES5/ES6写法
网上鲜有get和set的方法的实例,在这边再mark一下. get和set我个人理解本身只是一个语法糖,它定义的属性相当于“存储器属性” 为内部属性提供了一个方便习惯的读/写方式 ES5写法 func ...
随机推荐
- MAC本apache+php配置虚拟域名时踩的坑
昨天在调试Mac自带的Apache+PHP配置域名时,调试的让我怀疑人生.顿时心里一万个草泥马,我就是配置个虚拟域名啊,这么让我受伤 . 1 首先检查一下Apache是否开启, qutao@bogon ...
- 详解PROTOCOL BUFFERS
1. 前言 Protocal Buffers是google推出的一种序列化协议.由于它的编码和解码的速度,已经编码后的大小控制的较好,因此它常常被用在RPC调用中,传递参数和结果.比如gRPC. Pr ...
- java 冒泡排序 day003
一.冒泡排序: 利用冒泡排序对数组进行排序 二.基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数, ...
- vue 图片地址错误处理
<img src="/logo.png" :onerror="defaultImg"> data() { return { defaultImg: ...
- .net core读取json配置文件
一.新建.net core控制台程序 二.通过Nuget引入 Microsoft.Extensions.Configuration和microsoft.extensions.configuration ...
- TP-Shop安装步骤教程(Windows版)
TP-Shop安装步骤教程(Windows版) PS:首次发文,请多指教! 一.安装要求 1.PHP5.4以上,MYsql5.5以上. 2.需要Phpcurl,gd库.php_mysqli,php_o ...
- CocosCraetor中图像资源Texture和SpriteFrame的区别
Texture是保存在GPU缓冲中的一张纹理.是由一张图片创建获得的. SpriteFrame是Texture+Rect,根据一张纹理材质来剪切获得. SpriteFrame是Texture+Rect ...
- day19其他模块
collections模块 详细内容 http://www.cnblogs.com/Eva-J/articles/7291842.html 1.namedtuple: 生成可以使用名字来访问元素内容的 ...
- 2018-2019-3 网络对抗技术 20165235 Exp3 免杀原理与实践
2018-2019-3 网络对抗技术 20165235 Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 1.对某个文件的特征码进行分析,(特征码就是一类恶意文件中经常出现的一段代 ...
- dos choice 命令
dos choice 命令 choice /c YNC /m "Are you sure?" if %errorlevel%==1 goto Y if %errorlevel%== ...