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. 细讲递归(recursion)

    首先先对递归进行入门. 递归是以自相似的方式重复项目的过程.在编程语言中,如果程序允许您在同一函数内调用函数,则称其为函数的递归调用. 简而言之,递归就是函数的自身调用.可以看看下面的递归使用: vo ...

  2. HDU 5384——Danganronpa——————【AC自动机】

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. Day7上

    T1 部分分 枚举某个数 100 离散化.或 map 相对了不知道呢过不能过. T2 逆序对,不知对不对 归并排序,

  4. hystrix应用介绍(二)

    上篇博客中讲了hystrix在公司中的一些应用场景,由于保密的原因没办法贴出优化的代码,这里专门写一篇hystrix代码的demo,供大家在使用的过程中快速上手 Hystrix有两个请求命令 Hyst ...

  5. hdu 4044 树形DP 炮台打怪 (好题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题目大意:给定n个节点组成的树,1为敌方基地,叶子结点为我方结点.我们可以在每个结点安放炮台,至 ...

  6. Java设计模式—中介者模式

    中介者模式是一种并不常用的模式,在此简单阐述阐述. 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码

    1.前言 在14年的时候写过一篇博客关于ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题,但是当时并没有很好的解决这样一个问题,也并没有深入研究分析这样的一个异常 ...

  8. JAVA的图片文字识别技术

    从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...

  9. Sigrity PowerDC是如何计算IR Drop Margin?

    IR Drop仿真是一个系统层面的问题,需要考虑完整的Power Distribution System(PDS)链路上所有压降,并以此来优化每颗器件所接收到的供电电压. 在设计设计中所有的电源供电芯 ...

  10. C#中WinForm程序退出方法技巧总结[转]

      这篇文章主要介绍了C#中WinForm程序退出方法,实例总结了技巧退出WinForm程序窗口的各种常用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了C#中WinForm程序退出方法技 ...