计算两个日期之间的差异

时间:2017-01-28 22:40:42

标签: java

对于我的大学项目(酒店管理系统),我需要计算两个日期之间的差异,我只是按照跟随的代码工作。

zypper in puppet

但是我遇到了其他java项目,他们的代码为

txtarrivaldate.getDate();
    txtdeparturedate.getDate();
    long arrivalmillisec = txtarrivaldate.getDate().getTime();
    // System.out.println(arrivalmillisec);
    long departuremillisec = txtdeparturedate.getDate().getTime();
    // System.out.println(departuremillisec);
    long diffmilisec = (departuremillisec - arrivalmillisec);
    long diffdays = (departuremillisec - arrivalmillisec) / (24 * 60 * 60 * 1000);
    String noofdays = Long.toString(diffdays);
        System.out.println(noofdays);

我无法理解为什么在两个日期之间添加了ONE_HOUR。我非常希望感谢排序混乱。

2 个答案:

答案 0 :(得分:4)

这可能是因为timezone差异(UTC与BST等)。第二种方法是通过在结束日期添加一小时来尝试修复

我建议在应用启动时设置default时区,让Java处理timezone转换,例如:

public static void main(String[] args) throws Exception {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date d1 = sdf.parse("2017-01-20");
    Date d2 = sdf.parse("2017-01-28");
    long diffdays = (d2.getTime() - d1.getTime()) / (24 * 60 * 60 * 1000);
    System.out.println(diffdays);
}

另一种方法是使用Java 8的日期时间库来计算天数,例如:

public static void main(String[] args) throws Exception {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date d1 = sdf.parse("2017-01-20");
    Date d2 = sdf.parse("2017-01-28");
    long days = Duration.between(d1.toInstant(), d2.toInstant()).toDays();
    System.out.println(days);
}

HereDuration类的javadoc。

答案 1 :(得分:0)

Answer by Mehta是正确的。

使用java.time

此外,您完全使用了错误的类。

麻烦的旧日期时间类(DateCalendar等)现在已经遗留下来,取而代之的是java.time类。

Instant

而不是java.util.Date使用InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

如果您需要与尚未更新到java.time的旧代码进行交互,请转换。查看添加到旧类的新方法。

Instant instant = myJavaUtilDate.toInstant();

通常最适合使用UTC,尤其是数据存储和数据交换。因此,经常使用Instant类。

时区

为了确定天数,我们需要确定日期。为了确定日期,我们需要时区。对于任何给定的时刻,日期在全球范围内因地区而异。例如,午夜过后几分钟巴黎法国是新的一天,而在蒙特利尔魁北克仍然是“昨天”。

ZonedDateTime

应用时区(ZoneId)以获得ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();

ChronoUnit

不要尝试自己做日期时间数学。首先,你假设每小时是60分钟,每天是24小时,依此类推。你错了。夏令时(DST)等异常情况以及经常重新定义时区的政治家意味着这种假设是错误的。让java.time做数学运算。

你似乎想要在两个时间点之间的几天。为此,请使用ChronoUnit枚举,TemporalUnit的实现。当提供ZonedDateTime个对象时,ChronoUnit类精通时区和异常,例如DST转换。请务必阅读课程文档,了解并理解在这种情况下的行为。

long days = ChronoUnit.DAYS.between( zdtStart , zdtStop );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore