日期输出问题

时间:2013-07-22 11:20:31

标签: java

import java.text.DateFormat;
import java.util.Date;

public class DatePlus {

    public static void main(String[] args) {
        Date now = new Date();
        //Date now1 = new Date();
        Date now2 = new Date();
        DateFormat currentDate = DateFormat.getDateInstance();

        int count1=10;
        int count2=15;

        Date addedDate1 = addDays(now2, count1);
        Date addedDate2 = addDays(addedDate1, count2);
        System.out.println(currentDate.format(addedDate1));
        System.out.println(currentDate.format(addedDate2));
    }

    public static Date addDays(Date d, int days) {
        d.setTime(d.getTime() + days * 1000 * 60 * 60 * 24);
        return d;
    }
}

日期addedDate1addedDate2输出语句打印的日期相同,但预期输出不同。

4 个答案:

答案 0 :(得分:7)

问题是您没有返回新的Date实例,而是更改提供的实例。您始终修改并打印相同的实例。

将您的功能更改为

public static Date addDays(Date d, int days) {
    return new Date(d.getTime() + days * 1000 * 60 * 60 * 24);
}

答案 1 :(得分:3)

您可以使用Calender class:

,而不是编写自己的方法
public static void main(String[] args) 
    {
        Date now = new Date();
//        Date now2 = new Date();
        DateFormat currentDate = DateFormat.getDateInstance();

        int count1=10;
        int count2=15;

        Calendar c=Calendar.getInstance();
        c.setTime(now); 
        c.add(Calendar.DATE, count1); 
        Date addedDate1 = c.getTime();

        c.setTime(addedDate1);
        c.add(Calendar.DATE, count2); 
        Date addedDate2 = c.getTime();

        System.out.println(currentDate.format(addedDate1));
        System.out.println(currentDate.format(addedDate2));
    }

答案 2 :(得分:1)

正如在几个答案/评论中已经提到的那样,手动进行这些计算是有风险且容易出错的 以下是您需要的基本示例,使用Joda Time库,这是JDK Date,Calendar的一个非常稳定且设计良好的替代方案。等...

public static void main(String[] args) {
    DateTime now = new DateTime();
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();

    int count1=10;
    int count2=15;

    DateTime addedDate1 = now.plusDays(count1);
    DateTime addedDate2 = addedDate1.plusDays(count2);

    System.out.println(fmt.print(addedDate1));
    System.out.println(fmt.print(addedDate2));
}

另外,请记住,除了更好的设计和清晰的文档外,Joda Time还主要是线程安全的,因为它总是返回不可变对象。 最后,它与JDK日期和日历一起发展为可互操作

答案 3 :(得分:0)

正如 dystroy 所提到的,你没有创建一个新实例,这就是问题所在。

顺便说一句,您可以使用像Apache Commons Language之类的外部库来执行此类逻辑,这已经过很好的测试,您可以避免此类问题。 Commons Language已经有addDays method

更好的是,你可以使用Joda-Time,它也有这种方法。