如何在Java中减去日期?

2022-09-01 03:04:05

我的心脏在内部流血,因为我不得不深入减去两个日期来计算天数的跨度:

    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的残暴吗?还是有我应该知道的隐藏方法?

与其使用 GregorianCalendar,不如在 util 中使用 Date 类吗?如果是这样,我应该注意像1970年这样微妙的事情吗?

谢谢


答案 1

这确实是标准Java API中最大的史诗级故障之一。请耐心等待,然后您将获得JSR 310 / ThreeTen指定的新日期和时间API,该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背后的人,所以它看起来会非常相似。


答案 2

您可以使用以下方法:

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