你如何减去Java中的日期?

Hao*_*est 40 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Bal*_*usC 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();
Run Code Online (Sandbox Code Playgroud)

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

  • 我有一个小项目,只需要几个地方就需要它.从.NET重新开始,我对java感到愤怒和沮丧.谢谢你的确认. (3认同)
  • @James:不是在Java 7.它可能在Java 8中,另见http://blog.joda.org/2010/12/what-about-jsr-310_153.html(注意:在此答案后4个月发布).我更新了答案中的链接. (2认同)

dan*_*eng 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)));
Run Code Online (Sandbox Code Playgroud)