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 ...
随机推荐
- Redis从入门到精通【centos下的安装】
上传redis 到服务器 解压并重命名 然后yum -y install gcc-c++ zlib zlib-devel pcre pcre-devel openssl openssl-devel 然 ...
- 初学python之路-day06
每天一篇总结,今天学习了大概有深浅拷贝,元组类型,字典类型与集合类型.第一次感觉有点难度,需要花费多点时间来掌握. 深浅拷贝,分为值拷贝.浅拷贝.深拷贝. ls = [1, 'abc', [10]] ...
- php 日历代码
日历的PHP接口代码: $user_id = $_SESSION['user_id']; $year = isset($_REQUEST['tty']) ? intval($_REQUEST['tty ...
- C#QQ邮箱验证
注意: QQ邮箱的简单邮件传输协议(SMTP)使用了SSL加密,必须启用SSL加密.指定端口. QQ邮箱POP3/SMTP服务默认是关闭的,需要开启服务(设置=>账户=>开启服务). QQ ...
- 如何在Django中配置MySQL数据库
直接上图 在项目中直接找到settings 文件 第一步 原始Django自带数据库 第二步将配置改成MySQL的数据 第三步 在__init__文件中告知Django使用MySQL数据 ...
- Linux S和T权限
S (setuid) 场景: 像修改密码的流程其实就是通过 /usr/bin/passwd 命令对 /etc/passwd进行修改,我们需要修改自己的密码(就是修改/etc/shadow),然而普通用 ...
- C#获取指定的文件是否是内部特殊版本的代码
把内容过程经常用到的内容片段珍藏起来,下面的内容内容是关于C#获取指定的文件是否是内部特殊版本的内容,希望对各朋友有所用处. using System;using System.Diagnostics ...
- css属性之统一设置文本及div之间的对齐方式
设为 Flex 布局以后,子元素的float.clear和vertical-align属性将失效.hdp-uf{ display: -webkit-box; /* 老版本语法: Safari, iOS ...
- buaaoo_first_assignment
四周之前,我不懂面向对象是什么:四周之后,我依然不懂面向对象是什么. 一.第一次作业 (1)实现 说起来,本次作业是最惨烈的一次. 虽然它很简单,但由于未熟悉正则表达式的应用,导致判断wrong fo ...
- linux 访问到对应的接口
8080端口已经打开. 8080端口已被监听 telnet 192.168.163.128 8080 成功 也可以将防火墙关闭,这样所有的接口已经开放,不会再被拦截.这种情况下只要8080端口被某 ...