你如何减去Java中的日期?

时间:2010-08-19 21:41:09

标签: java datetime

我必须深入减去两个日期以计算天数的跨度,内心正在流血:

    GregorianCalendar c1 = new GregorianCalendar();
    GregorianCalendar c2 = new GregorianCalendar();
    c1.set(2000, 1, 1);
    c2.set(2010,1, 1);
    long span = c2.getTimeInMillis() - c1.getTimeInMillis();
    GregorianCalendar c3 = new GregorianCalendar();
    c3.setTimeInMillis(span);
    long numberOfMSInADay = 1000*60*60*24;
    System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653

在.NET中只有2行代码,或者您命名的任何现代语言。

这是java的残暴吗?或者我应该知道一种隐藏的方法吗?

可以在util中使用Date类,而不是使用GregorianCalendar吗?如果是这样,我应该留意像1970年那样微妙的事情吗?

由于

5 个答案:

答案 0 :(得分:49)

这确实是标准Java API中最大的史诗失败之一。有一点耐心,那么你将获得JSR 310 / ThreeTen指定的新日期和时间API的解决方案,这很可能会包含在即将推出的Java 8中。

在那之前,你可以逃脱JodaTime

DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0);
DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0);
int days = Days.daysBetween(dt1, dt2).getDays();

它的创造者斯蒂芬·科勒伯恩(Stephen Colebourne)就像JSR 310背后的那样,所以它看起来很相似。

答案 1 :(得分:18)

您可以使用以下方法:

SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");

long d1=formater.parse("2001-1-1").getTime();
long d2=formater.parse("2001-1-2").getTime();

System.out.println(Math.abs((d1-d2)/(1000*60*60*24)));

答案 2 :(得分:3)

如果您处理日期,最好查看joda时间库以获得更合理的日期操作模型。

http://joda-time.sourceforge.net/

答案 3 :(得分:3)

您可以删除第三个日历实例。

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();
c1.set(2000, 1, 1);
c2.set(2010,1, 1);
c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis());

答案 4 :(得分:0)

这是基本方法,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

有一种简单的方法可以实现它。我们可以使用带有循环的Calendar.add方法。 beginDate和endDate之间的减去天数,以及 下面实现的代码

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The subtraction between two days is " + (minusDays + 1));**