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

题外话

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

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

python Logo
image-2239

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

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提供的更新一时半会还缓不过来,只能在每次写代码的时候,尽量用新特性.

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

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

发表评论

您的电子邮箱地址不会被公开。

*

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