Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GregorianCalendar实例来确定经过的时间?_Java_Compare_Gregorian Calendar - Fatal编程技术网

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

Java 使用GregorianCalendar实例来确定经过的时间?,java,compare,gregorian-calendar,Java,Compare,Gregorian Calendar,我在我的CIS 163班上做一个项目,这个项目实际上是一个露营地预订系统。大部分代码都已经提供了,我只需要向其中添加一些功能。目前,我需要能够确定两个不同的GregoriaCalendar实例(一个是当前日期,另一个是预定的“签出”)之间经过了多少时间,以天表示。我还不知道该怎么做,希望这里的人能帮我解决。格雷戈里安日历已经很旧了,你不应该再使用它了。它很麻烦,从Java8开始就被“新的”java.time模块所取代 尽管如此,如果需要使用GC实例进行比较,可以使用日期之间的毫秒数轻松计算时间,

我在我的CIS 163班上做一个项目,这个项目实际上是一个露营地预订系统。大部分代码都已经提供了,我只需要向其中添加一些功能。目前,我需要能够确定两个不同的GregoriaCalendar实例(一个是当前日期,另一个是预定的“签出”)之间经过了多少时间,以天表示。我还不知道该怎么做,希望这里的人能帮我解决。

格雷戈里安日历已经很旧了,你不应该再使用它了。它很麻烦,从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);
LocalDate date3 = gcDate1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate date4 = gcDate2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
如果您想使用新的时间API,下面的代码可以工作

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

Period period = Period.between(date1, date2);
int diff = period.getDays();
System.out.println(diff);
如果需要在类型之间进行转换(例如,您使用的是旧代码),您可以这样做:

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);
LocalDate date3 = gcDate1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate date4 = gcDate2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

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

由于您被迫使用了设计拙劣的旧
GregorianCalendar
类,所以首先要做的是将这两个
GregorianCalendar
对象分别转换为现代类型。因为Java8
GregorianCalendar
有一个方法可以将其转换为
ZoneDateTime
。查看文档,我在下面添加了一个链接

现在您已经有了两个
ZoneDateTime
对象,根据您的具体需求有不同的路径。人们通常会使用
Duration.between()
来查找持续时间,以小时、分钟、秒和秒的分数为单位。如果您知道始终只需要这些时间单位中的一个,则可以使用例如
chronuit.HOURS.between()
chronuit.millises.between()
。如果需要计算天数,请使用
ChronoUnit.days.between()

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

因为这是家庭作业,如果我给你代码(在很多其他情况下我都会这么做),那将是不公平的。快乐编码

链接
  • 文件:
    • (长期过时,除非被迫使用,否则请勿使用)
  • 解释如何使用java.time,这是现代java日期和时间API,属于
    ZoneDateTime
    Duration
    ChronoUnit
    Period

可能是我的措辞,但我找不到我要找的东西,我会用时间,但我得到的代码是用GC编写的,我没有时间将所有代码转换过来。谢谢你的帮助!API之间的一个主要区别是本地化(处理日历时非常痛苦…)。既然你提到了,我将编辑答案来掩盖如何在日历和LocalDate之间转换。也没关系,我很高兴能帮上忙!!这只是想让你知道,我担心你的问题在没有通知的情况下被否决/关闭并不难,因为这是一个有点“常见”的问题。他们是否在分发代码,迫使你使用
gregoriacalendar
?那是个丑闻。那门课设计得很糟糕,而且早已过时。任何人都不应该使用它。已经过去了多少时间-以月、日、小时、毫秒或以上所有形式?