题外话
标题明显是”标题党”了,简单说下:只是因为今天想用Python写一个获取昨天的日期,但是复杂度是:我要连着获取好几天的.,比如今天是1号,连着获取10天就要到上个月21号了(是这样没错吧?)
一开始用Python写了一个版本,调了大半天,后来才调好……此刻才发现有更好的解决方案!!!!!!
Python实现
没错,正好今天没事,我也写了一个Java版本的.
请不要像下面这样去写,后面有比较好的方案!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #Python代码片段1 resultdata=[] ''' 计算过去的日期较复杂版本--失败版本--请不要使用这个版本的,可以学习下在哪个地方写失败了!!! 调用 :#print getlastdate(2015,01,05,20) years:年 months:月 dates:日 number:往后退多少天. ''' def getlastdate(years,months,dates,number): resudata="" if number > 0 : #print str(years)+"-----"+str(months)+"-----"+str(dates) rsnumber=number-1 last = datetime.date( int(years)-1 if (months==01 and dates==01) else int(years), int(months)-1 if dates==01 else int(months),int(dates))-datetime.timedelta(1) dates=str(last)[8:] monthss=str(last)[5:7] yearss = str(last)[0:4] #print monthss resudata=str(last).replace("-","") if number==0: return resultdata resultdata.append(resudata) return getlastdate(yearss,monthss,dates,rsnumber) |
说来惭愧,上面那个版本太失败了,下面这个稍微好些,可能还有更好的办法去实现,等我发现在说吧.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #Python代码片段2 ''' 计算过去的日期,可用版本 调用: print getLastDATE(10) @prd @2015.1.24 @numbs:要减少的数. ''' jsdate=[] def getLastDATE(numbs): resultdatas="" rsnums=numbs-1 if numbs>0: last = datetime.date( datetime.datetime.now().year, datetime.datetime.now().month,datetime.datetime.now().day)-datetime.timedelta(numbs) resultdatas=str(last).replace("-","") if numbs==0: return jsdate jsdate.append(resultdatas) return getLastDATE(rsnums) |
2015.1.28 :UPDATE:更加简洁的版本,上述版本可能有重大错误!
1 2 3 4 5 6 | // thanks cys. def getLastDATE(numbs): day = datetime.datetime.now() - datetime.timedelta(days=numbs) rdate = [(day + datetime.timedelta(days=i)).strftime("%Y%m%d") for i in range(numbs,0,-1 )] return rdate[:len(rdate)] |
关于[Python代码片段1]和[Python代码片段2]想必一眼就看出来了…不说了,继续去看Python……不对,Java版本发完再说,哈哈
Java实现
对于Java来说,实现还是没难度的,基本就是把Python上面写的思路拿过来改一下就可以用了.
但是….但是…..我还是做了两个版本…只是一个稍逊,另一个更好些.
一个是Java 1.7版本的,另外一个是最新版的[这个有亮点,写起来超爽啊!!!].
没有从[Python代码片段1]的思路来实现Java版本的,我是真的…………懒!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | //Java 1.7 版本,稍微复杂些 /** 计算日期 @author prd @date 2015.1.24 */ public class Main{ /** * 计算日期:在当前日期上加或者减 * * @param numbers 天数:如果要加,请传递正数,反之则传递负数 * @param flag 标识:标明是增加还是减少.增加:true,减少:false * @param list 返回此list:若无此参数可能导致数据重复 * @return */ private List<String> addCalendar(int numbers,boolean flag,List<String> list){ if (flag) {//上升 if (numbers < 0) { Calendar ca = Calendar.getInstance(); ca.add(Calendar.DAY_OF_YEAR, numbers); addCalendar(numbers += 1,true,list); list.add(new SimpleDateFormat("yyyy-MM-dd").format(ca.getTime())); } }else{ if (numbers > 0) { Calendar ca = Calendar.getInstance(); ca.add(Calendar.DAY_OF_YEAR, numbers); list.add(new SimpleDateFormat("yyyy-MM-dd").format(ca.getTime())); addCalendar(numbers -= 1, false,list); } } return list; } /*打印list*/ private void iteratorList(List li){ for (int i = 0; i < li.size(); i++) { System.out.println(li.get(i)); } } public static void main(String[] args) { Main m = new Main(); m.iteratorList(m.addCalendar(-5, true,new ArrayList<String>())); // 当前日期减少5天 System.out.println("--------------------------------"); m.iteratorList(m.addCalendar(5, false,new ArrayList<String>()));//当前日期增加5天 } } |
下面是Java 1.8版本,请使用Jdk 1.8 来运行!
说实话,Java 1.8版本提供的时间类库简直太爽了,竟然能让人想起写Python时的”飘逸”……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Main{ /** * ----请使用Java 8 运行 * * 在当前日期上进行加减操作. * * * @param number 要加减的数字,直接传递正整数即可 * @param flag 加:true,减:false * @param list 用于返回数据,以保证不会有数据错误. * @return */ private static List<String> getDatejava8(int number,boolean flag,List<String> list){ if (number > 0) { LocalDateTime date = LocalDateTime.now(); boolean rs = flag ? list.add(date.plusDays(number).format(DateTimeFormatter.ISO_LOCAL_DATE).toString()): list.add(date.minusDays(number).format(DateTimeFormatter.ISO_LOCAL_DATE).toString()) ; getDatejava8(number -= 1, flag, list); } return list; } public static void main(String[] args) { // 请使用Java8运行. getDatejava8(5,true,new ArrayList<String>()).forEach(System.out::println);//在当前日期上增加日期并打印 System.out.println("--------------------------------"); //------------- getDatejava8(10,false,new ArrayList<String>()).forEach(System.out::println);//在当前日期上减少日期并打印 } } |
忽略,也可以不忽略
Java 1.8提供的更新一时半会还缓不过来,只能在每次写代码的时候,尽量用新特性.
但愿,但愿,以后可以不走弯路.
虽然,弯路也是一种成长!