我在CIS 163班上做一个项目,这个项目实际上是一个露营地预订系统。大部分代码都提供了,我只需要添加某些功能。目前,我需要能够确定两个不同的GregorianCalendar实例(一个是当前日期,另一个是预定的"签出"(之间用天数表示的时间。我一直想不出该怎么做,希望这里有人能帮我。
GregorianCalendar很旧了,你真的不应该再使用它了。它很麻烦,从Java8开始就被"新的"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);
如果您想使用新的Time 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
类,因此您应该做的第一件事是将两个GregorianCalendar
对象中的每一个转换为现代类型。由于Java 8GregorianCalendar
有一个将其转换为CCD_。查看文档,我在下面包含一个链接。
现在您已经有了两个ZonedDateTime
对象,根据您的确切需求,有不同的路径。通常,人们会使用Duration.between()
来计算持续时间,即它们之间的时间量,单位为小时、分钟、秒和几分之一秒。如果您知道您总是只需要其中一个时间单位,那么您可以使用例如ChronoUnit.HOURS.between()
或ChronoUnit.MILLISECONDS.between()
。如果需要计算天数,请使用ChronoUnit.DAYS.between()
。
如果您需要以月和天为单位的时间,则应使用Period.between()
。
链接
- 文档:
GregorianCalendar
(早已过时,除非迫不得已,否则不要使用(Duration
ChronoUnit
Period
- Oracle教程:日期-时间,说明如何使用java.Time,这是
ZonedDateTIme
、Duration
、ChronoUnit
和Period
所属的现代java日期和时间API