Java 以天为单位计算两个日期之间的差异

Java 以天为单位计算两个日期之间的差异,java,Java,对于我的大学项目(酒店管理系统),我需要计算两个日期之间的差异,我只需使用以下代码 txtarrivaldate.getDate(); txtdeparturedate.getDate(); long arrivalmillisec = txtarrivaldate.getDate().getTime(); // System.out.println(arrivalmillisec); long departuremillisec = txtdepartureda

对于我的大学项目(酒店管理系统),我需要计算两个日期之间的差异,我只需使用以下代码

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);
然而,我遇到了其他java项目,它们的代码如下所示

 static final long ONE_HOUR = 60 * 60 * 1000L;
 dt1=jDateChooser1.getDate();
        dt2=jDateChooser2.getDate();
        String strdtver1=(String) sdf.format(jDateChooser1.getDate());
        String strdtver2=(String) sdf.format(jDateChooser2.getDate());
        long diff=((dt2.getTime()-dt1.getTime()+ONE_HOUR)/(ONE_HOUR*24));
        diffday=Long.toString(diff);
        jTextField4.setText(diffday+"  day(s)");

我不明白为什么在两次约会之间加了一个小时。我非常感谢你整理了这一混乱局面

这可能是因为时区不同(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);
}
另一种方法是使用
Java8
的日期时间库来计算天数,例如:

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);
}

这是持续时间类的javadoc。

这可能是因为时区不同(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);
}
另一种方法是使用
Java8
的日期时间库来计算天数,例如:

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);
}
这是持续时间类的javadoc。

正确

使用java.time 而且,您完全使用了错误的类

麻烦的旧日期时间类(
date
Calendar
等)现在是遗留的,被java.time类取代

Instant
不要使用
java.util.Date
而使用
Instant
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

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

Instant instant = myJavaUtilDate.toInstant();
通常最好在UTC工作,尤其是在数据存储和数据交换方面。所以要经常使用
Instant

时区 为了确定日期,我们需要确定日期。为了确定日期,我们需要时区。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,午夜过后几分钟,法国巴黎是一个新的一天,而魁北克山仍然是“昨天”

ZoneDateTime
应用时区(
ZoneId
)以获取一个

ChronoUnit
不要试图自己计算日期时间。首先,假设每小时是60分钟,每天是24小时,以此类推。你错了。夏时制(DST)等反常现象和政客经常重新定义时区意味着这些假设是错误的。让java.time来计算

您似乎希望在两个时间点之间有几天的间隔。为此,请使用enum,它是
TemporalUnit
的一个实现。当fed
ZonedDateTime
对象时,
ChronoUnit
类对时区和异常(如DST转换)非常熟悉。请务必阅读类文档,了解并理解其在此类情况下的行为

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

正确

使用java.time 而且,您完全使用了错误的类

麻烦的旧日期时间类(
date
Calendar
等)现在是遗留的,被java.time类取代

Instant
不要使用
java.util.Date
而使用
Instant
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

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

Instant instant = myJavaUtilDate.toInstant();
通常最好在UTC工作,尤其是在数据存储和数据交换方面。所以要经常使用
Instant

时区 为了确定日期,我们需要确定日期。为了确定日期,我们需要时区。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,午夜过后几分钟,法国巴黎是一个新的一天,而魁北克山仍然是“昨天”

ZoneDateTime
应用时区(
ZoneId
)以获取一个

ChronoUnit
不要试图自己计算日期时间。首先,假设每小时是60分钟,每天是24小时,以此类推。你错了。夏时制(DST)等反常现象和政客经常重新定义时区意味着这些假设是错误的。让java.time来计算

您似乎希望在两个时间点之间有几天的间隔。为此,请使用enum,它是
TemporalUnit
的一个实现。当fed
ZonedDateTime
对象时,
ChronoUnit
类对时区和异常(如DST转换)非常熟悉。一定要把课堂文档读给k