hoursBetween 给出的答案太大

hoursBetween gives too big value as answer

我真的不知道我的代码有什么问题。我在这种情况下使用 Joda-Time api。此代码在 rs.next() 之后,我需要以整数形式获取 hh 的值,因为我必须将它乘以停车服务的小时费率。

java.sql.Time timeOut = new java.sql.Time(new java.util.Date().getTime());
java.sql.Time timeIn = rs.getTime("timeIn");
DateTime d2 = new DateTime(timeOut);//Value is 18:39:24
DateTime d1 = new DateTime(timeIn);//Value is 16:03:50
int hh = Hours.hoursBetween(d1,d2).getHours();
txtDuration.setText(""+hh);//Display on textbox and shows 421946

也试过这个

Duration duration = new Duration(d1,d2);
long ss = duration.getStandardSeconds();
long mm = ss/60;
long hh = mm/60;

美好的一天,提前谢谢你。

来自java.sql.Time javadoc

The date components should be set to the "zero epoch" value of January 1, 1970 and should not be accessed.

然后,在您的代码中

java.sql.Time timeOut = new java.sql.Time(new java.util.Date().getTime());

new java.util.Date() 通常不会是 1970 年 1 月 1 日,因此您实际上是在创建一个无效的 java.sql.Time 实例。幕后可能发生的事情是,您正在计算 1970 年 1 月 1 日某个时刻(您的 timeIn,来自数据库并且可以假设是正确的)和某个时刻 现在:

421946小时=421946/24天~17581天~17581/365年~48年

1970 + 48 = 2018,今年。

看起来您在数据库的 timeIn 列中没有 Date 部分。

Hours.hoursBetween(DateTime.parse("1970-01-01T16:03:50"), DateTime.parse("2018-02-19T18:39:24")).getHours()  == 421946

如果您只想比较时间(没有日期部分),您可以使用 joda 库中的 LocalTime

LocalTime d2 = new LocalTime(timeOut.getTime());
LocalTime d1 = new LocalTime(timeIn.getTime());

或指定合适的日期:

d1.withDate(<put proper date here>)

虽然我没有使用 Joda-Time 的经验,但我知道 java.time 答案:

    LocalTime timeOut = LocalTime.now(ZoneId.of("Africa/Khartoum"));
    LocalTime timeIn = rs.getObject("timeIn", LocalTime.class);
    int hh = (int) ChronoUnit.HOURS.between(timeIn, timeOut);

你确定你从数据库中知道时间的时区吗? “现在”是一个对时区非常敏感的概念,因此如果您的时区不匹配,您几乎可以得到任何不正确的结果。相信您确实知道,如果不是 Africa/Khartoum,请替换为正确的时区。另外你确定时间是同一天吗?您可以试试这个更正:

    if (timeOut.isBefore(timeIn)) {
        hh += 24;
    }

它显然有其局限性。如果时间相隔几天,它将不起作用。最后,如果在 timeIntimeOut 之间转换夏令时 (DST),您知道您想要什么结果吗?

你以为你就是问这个问题的人。 ;-)

略读 the documentation of org.joda.time.LocalTime 在我看来你可以以非常相似的方式使用 class,使用 no-arg 构造函数构造 timeOuttimeIn 使用 LocalTime(Object instant) 构造函数。