使用 GregorianCalendar 的实例来确定经过的时间?

Using instances of GregorianCalendar to determine time passed?

我正在 CIS 163 class 中开展一个项目,该项目实际上是一个露营地预订系统。提供了大部分代码,我只需要向其中添加某些功能。目前我需要能够确定以天数表示的 2 个不同的 GregorianCalendar 实例(一个是当前日期,另一个是预定的 "check out")之间经过了多少时间。我一直无法弄清楚如何做到这一点,希望这里有人可以帮助我。

GregorianCalendar 很旧,您真的不应该再使用它了。它很麻烦,自 Java 8.

以来被 "new" java.time 模块取代

不过,如果您需要使用 GC 实例进行比较,您可以使用日期之间的毫秒数轻松计算时间,如下所示:

GregorianCalendar date1 = new GregorianCalendar();
GregorianCalendar date2 = new GregorianCalendar();

// Adding 15 days after the first date
date2.add(GregorianCalendar.DAY_OF_MONTH, 15);
long duration = (date2.getTimeInMillis() - date1.getTimeInMillis() )
                         / ( 1000 * 60 * 60 * 24) ;
System.out.println(duration);

如果你想使用新的时间 API,下面的代码就可以了。

LocalDate date1 = LocalDate.now();
LocalDate date2 = date1.plusDays(15);

Period period = Period.between(date1, date2);
int diff = period.getDays();
System.out.println(diff);

如果您需要在类型之间进行转换(例如,您正在使用遗留代码),您可以这样做:

LocalDate date3 = gcDate1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate date4 = gcDate2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

另外我很确定这个问题一定被问过一遍又一遍,所以在问之前确保你搜索正确。

由于您被迫使用旧的且设计不佳的 GregorianCalendar class,您应该做的第一件事是将两个 GregorianCalendar 对象中的每一个都转换为现代类型.由于Java 8 GregorianCalendar有一个方法可以将其转换为ZonedDateTime。查看文档,我在下面包含了一个link。

现在你有两个 ZonedDateTime 对象,根据你的具体要求有不同的路径。人们通常会使用 Duration.between() 来查找持续时间,它们之间的时间量(以小时、分钟、秒和秒的分数为单位)。如果您知道您将始终只需要这些时间单位之一,您可以改为使用 ChronoUnit.HOURS.between()ChronoUnit.MILLISECONDS.between()。如果需要计算天数,使用ChronoUnit.DAYS.between().

如果您需要以月和日为单位的时间,则应使用 Period.between()

链接