Friendly Date Ranges


1.要求

  • 把常见的日期格式如: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 即可

2.思路

  • 定义日期格式检测函数checkDate
  • 定义要替换文本的月份和日期末尾数组
  • 定义change函数,在不改变原有格式的情况下只替换要改变的文本
  • 在主函数中判断check过和change过的日期的各种形式,在不同日期形式下利用.push()方法将日期更改为易读的正确格式

3.代码

function checkDate(val){
if(parseInt(val[0].substr(0,4))<=parseInt(val[1].substr(0,4))){
return true;
} } var date=['0','st','nd','rd','th'];
var month=['0','January','February','March','April','May','June','July','August','September','October','November','December']; function change(val){
var temp1=val[0].split('-');
var temp2=val[1].split('-');
temp1[1]=month[parseInt(temp1[1])];
temp2[1]=month[parseInt(temp2[1])];
var te1=temp1[2].substr(-1,1);
var te2=temp2[2].substr(-1,1);
if(te1==='0'){
te1=4;
}
if(te2==='0'){
te2=4;
}
if(temp1[2].length==2&&temp1[2].substr(0,1)==='1'){
te1=4;
}
if(temp2[2].length==2&&temp2[2].substr(0,1)==='1'){
te2=4;
}
if(parseInt(te1)<4){
temp1[2]=parseInt(temp1[2])+date[parseInt(te1)];
}
else{
temp1[2]=parseInt(temp1[2])+date[4];
}
if(parseInt(te2)<4){
temp2[2]=parseInt(temp2[2])+date[parseInt(te2)];
}
else{
temp2[2]=parseInt(temp2[2])+date[4];
}
val[0]=temp1;
val[1]=temp2;
return val;
} function makeFriendlyDates(arr) {
var result=[];
if(checkDate(arr)){ arr=change(arr); if(arr[0][0]==arr[1][0]&&arr[0][1]==arr[1][1]&&arr[0][2]==arr[1][2]){//年月日相等,不去2017
var f1=[];
var f11=[];
f1.push(arr[0][1]);
f1.push(arr[0][2]);
result.push(f1.join(' '));
result.push(arr[0][0]);
f11.push(result.join(', '));
result=f11;
}
else if(arr[0][0]==arr[1][0]&&arr[0][1]==arr[1][1]){//年月相等
if(parseInt(arr[0][0])==2017&&parseInt(arr[1][0])==2017){
var r1=[];
r1.push(arr[0][1]);
r1.push(arr[0][2]);
result.push(r1.join(' '));
result.push(arr[1][2]);
}
else{ }//年月相等但不是2017年 暂不写
}
else if(arr[0][0]==arr[1][0]){//年相等 只按测试条目写,都是2017的时候
var f2=[];
var f22=[];
var f222=[];
f2.push(arr[0][1]);
f2.push(arr[0][2]);
f222.push(f2.join(' '));
f22.push(arr[1][1]);
f22.push(arr[1][2]);
f222.push(f22.join(' '));
result=f222;
}
else if(parseInt(arr[0][0])==2017){ //第一项是2017年
var f31=[];
var f32=[];
var f3=[];
f31.push(arr[0][1]);
f31.push(arr[0][2]);
f3.push(f31.join(' '));
f32.push(arr[1][1]);
f32.push(arr[1][2]);
f3.push(f32.join(' '));
result=f3;
}
else if(parseInt(arr[1][0])==2017){
var f41=[];
var f42=[];
var f43=[];
var f4=[];
f41.push(arr[0][1]);
f41.push(arr[0][2]);
f43.push(f41.join(' '));
f43.push(arr[0][0]);
f4.push(f43.join(', '));
f42.push(arr[1][1]);
f42.push(arr[1][2]);
f4.push(f42.join(' '));
result=f4;
}
else if(parseInt(arr[1][0])-parseInt(arr[0][0])==1){
if ((arr[0][1]==arr[1][1]) && (parseInt(arr[0][2])>parseInt(arr[1][2]))){
var f51=[];
var f52=[];
var f510=[];
//var f520=[];
var f5=[];
f51.push(arr[0][1]);
f51.push(arr[0][2]);
f510.push(f51.join(' '));
f510.push(arr[0][0]);
f5.push(f510.join(', '));
f52.push(arr[1][1]);
f52.push(arr[1][2]);
f5.push(f52.join(' ')); result=f5;
}
else{
var f61=[];
var f62=[];
var f610=[];
var f620=[];
var f6=[];
f61.push(arr[0][1]);
f61.push(arr[0][2]);
f610.push(f61.join(' '));
f610.push(arr[0][0]);
f6.push(f610.join(', '));
f62.push(arr[1][1]);
f62.push(arr[1][2]);
f620.push(f62.join(' '));
f620.push(arr[1][0]);
f6.push(f620.join(', ')); result=f6;
} }
else{
var f71=[];
var f72=[];
var f710=[];
var f720=[];
var f7=[];
f71.push(arr[0][1]);
f71.push(arr[0][2]);
f710.push(f71.join(' '));
f710.push(arr[0][0]);
f7.push(f710.join(', '));
f72.push(arr[1][1]);
f72.push(arr[1][2]);
f720.push(f72.join(' '));
f720.push(arr[1][0]);
f7.push(f720.join(', ')); result=f7;
}
return result;
} } makeFriendlyDates(['2017-01-02', '2017-01-05']);
makeFriendlyDates(["2008-10-31", "2009-10-31"]);

4.相关链接

Friendly Date Ranges-freecodecamp算法题目的更多相关文章

  1. Map the Debris -freecodecamp算法题目

    Map the Debris 1.要求 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: ...

  2. js-FCC算法Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  3. FCC(ES6写法) Friendly Date Ranges

    把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 包含当前年份和相同月份的时候,makeFri ...

  4. Friendly Date Ranges 让日期区间更友好

    把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...

  5. Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  6. Spinal Tap Case -freecodecamp算法题目

    Spinal Tap Case 1.要求 将字符串转换为 spinal case. Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也 ...

  7. Search and Replace -freecodecamp算法题目

    Search and Replace 1.要求 使用给定的参数对句子执行一次查找和替换,然后返回新句子. 第一个参数是将要对其执行查找和替换的句子. 第二个参数是将被替换掉的单词(替换前的单词). 第 ...

  8. [优化]Steamroller-freecodecamp算法题目

    晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...

  9. LeetCode算法题目解答汇总(转自四火的唠叨)

    LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...

随机推荐

  1. Linux证书登录,禁用密码

    如果验证成功的话就可以关闭密码登陆方式了, 编辑/etc/ssh/sshd_config, 将PasswordAuthentication改为no, ChallengeResponseAuthenti ...

  2. 硬盘和显卡的访问与控制(二)——《x86汇编语言:从实模式到保护模式》读书笔记02

    上一篇博文我们讲了如何看到实验结果,这篇博文我们着重分析源代码. 书中作者为了说明原理,约定了一种比较简单地用户程序头部格式,示意图如下(我参考原书图8-15绘制的,左边的数字表示偏移地址): 所以, ...

  3. java Redis工具类

    redis就是一个nosql数据库,做存储做缓存的,java代码中就是嵌入了一个客户端,读取与存储数据而已. 先来一个简单的工具类: package com.ming.redis; import re ...

  4. 项目中使用的spring 注解说明

    以前在项目中spring 的依赖注入使用 xml 配置,现在使用 注解(Annotation) 来实现配置. 1声明bean 1.1实例 有类: public class MyBean{ //do s ...

  5. Intellij IDEA +genymotion安装配置

    Intellij IDEA是一款非常好用的java编辑器,比Eclipse的代码提示要友善的多,优缺点不多讲了. 下面讲如何安装配置. 1)如官网下载最新版本 http://www.jetbrains ...

  6. kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法

    1.修改kindereditor-all.js中的 var re = /(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[ ...

  7. Hibernate课程 初探一对多映射4-1 inverse属性

    1 <Set>节点的inverse属性默认由one方来维护(默认值为false).将inverse属性修改为true则由多方来维护.

  8. vue-计算属性不能直接修改

    今天在开发的时候,遇到一个问题: 数据如下: data(){ queryCouponList : [] // 通过接口,会更新该数据 } , computed : { couponList () { ...

  9. JS兼用IE8的通过class名获取CSS对象组

    转自:Garon_InE 原生js方法“document.getElementsByClassName”在ie8及其以下浏览器中不能使用,所以写了一个兼容IE的方法. 完整的页面代码如下: testJ ...

  10. Linux安装中文字体包

    进入rhel5.5安装盘/Server路径找到字体安装包: fonts-chinese-3.02-12.el5.noarch.rpm fonts-ISO8859-2-75dpi-1.0-17.1.no ...