如何减去Java中的date?

我必须深深地减去两个date才能计算出天数:

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中只有两行代码,或者任何现代语言。

这是java的残酷吗? 还是有一个隐藏的方法,我应该知道?

而不是使用GregorianCalendar,可以在util中使用Date类吗? 如果是这样的话,我应该注意一下像1970年那样的微妙的东西吗?

谢谢

这确实是标准Java API中最大的史诗故障之一。 有一点耐心,那么你会得到你的解决scheme的JSR 310 / ThreeTen指定的新的date和时间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(); 

它的创build者Stephen Colebourne顺便说一下JSR 310的背后,所以它看起来非常相似。

您可以使用以下方法:

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

如果您处理date,最好查看joda时间库以获得更为理智的Date操作模型。

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

那么你可以删除第三个日历实例。

 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()); 

这是基本的方法,

 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));**