Code:未经”深思熟虑”的后果

题外话

标题明显是”标题党”了,简单说下:只是因为今天想用Python写一个获取昨天的日期,但是复杂度是:我要连着获取好几天的.,比如今天是1号,连着获取10天就要到上个月21号了(是这样没错吧?)

一开始用Python写了一个版本,调了大半天,后来才调好……此刻才发现有更好的解决方案!!!!!!

python Logo
image-2239

Python实现

没错,正好今天没事,我也写了一个Java版本的.

请不要像下面这样去写,后面有比较好的方案!

#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)

说来惭愧,上面那个版本太失败了,下面这个稍微好些,可能还有更好的办法去实现,等我发现在说吧.


#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:更加简洁的版本,上述版本可能有重大错误!


// 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标志
image-2240

Java实现

对于Java来说,实现还是没难度的,基本就是把Python上面写的思路拿过来改一下就可以用了.

但是….但是…..我还是做了两个版本…只是一个稍逊,另一个更好些.

一个是Java 1.7版本的,另外一个是最新版的[这个有亮点,写起来超爽啊!!!].

没有从[Python代码片段1]的思路来实现Java版本的,我是真的…………懒!

//Java 1.7 版本,稍微复杂些
/**

计算日期

@author prd
@date 2015.1.24

*/
public class Main{

/**
* 计算日期:在当前日期上加或者减
*
* @param numbers 天数:如果要加,请传递正数,反之则传递负数
* @param flag 标识:标明是增加还是减少.增加:true,减少:false
* @param list 返回此list:若无此参数可能导致数据重复
* @return
*/
private List addCalendar(int numbers,boolean flag,List 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())); // 当前日期减少5天
System.out.println("--------------------------------");
m.iteratorList(m.addCalendar(5, false,new ArrayList()));//当前日期增加5天
}
}

下面是Java 1.8版本,请使用Jdk 1.8 来运行!

说实话,Java 1.8版本提供的时间类库简直太爽了,竟然能让人想起写Python时的”飘逸”……


public class Main{
/**
* ----请使用Java 8 运行
*
* 在当前日期上进行加减操作.
*
*
* @param number 要加减的数字,直接传递正整数即可
* @param flag 加:true,减:false
* @param list 用于返回数据,以保证不会有数据错误.
* @return
*/
private static List getDatejava8(int number,boolean flag,List 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()).forEach(System.out::println);//在当前日期上增加日期并打印
System.out.println("--------------------------------");
//-------------
getDatejava8(10,false,new ArrayList()).forEach(System.out::println);//在当前日期上减少日期并打印
}
}

忽略,也可以不忽略

Java 1.8提供的更新一时半会还缓不过来,只能在每次写代码的时候,尽量用新特性.

但愿,但愿,以后可以不走弯路.

虽然,弯路也是一种成长!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据