使用 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()
。
链接
- 文档:
GregorianCalendar
(早已过时,除非被迫,否则不要使用)
Duration
ChronoUnit
Period
- Oracle tutorial: Date Time 解释如何使用 java.time,现代 Java 日期和时间 API
ZonedDateTIme
,Duration
,ChronoUnit
和 Period
属于。
我正在 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()
。
链接
- 文档:
GregorianCalendar
(早已过时,除非被迫,否则不要使用)Duration
ChronoUnit
Period
- Oracle tutorial: Date Time 解释如何使用 java.time,现代 Java 日期和时间 API
ZonedDateTIme
,Duration
,ChronoUnit
和Period
属于。