hoursBetween作为答案给出了太大的价值

时间:2018-02-19 11:06:25

标签: java mysql jodatime

我真的不知道我的代码有什么问题。我在这个案子上使用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;

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

3 个答案:

答案 0 :(得分:3)

来自java.sql.Time javadoc

  

日期组件应设置为"零时代" 1970年1月1日的价值,不应进入。

然后,在你的代码中

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年,今年。

答案 1 :(得分:0)

您似乎在DB中的Date列中没有timeIn部分。

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

答案 2 :(得分:0)

虽然我没有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);

您确定从数据库中知道时间的时区吗? “现在”是一个非常适合时区的概念,因此如果您的时区不匹配,您可以获得任何不正确的结果。相信你知道,如果不是非洲/喀土穆,请用正确的时区代替。你还确定时间是在同一天吗?您可以尝试这种更正:

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

它显然有其局限性。如果时间间隔几天,它将无法工作。最后,如果在timeIntimeOut之间有夏季时间(夏令时)过渡,您知道自己想要的结果吗?

你认为你是那个问这个问题的人。 ; - )

浏览the documentation of org.joda.time.LocalTime在我看来,您可以以非常类似的方式使用该类,使用no-arg构造函数构建timeOut,使用timeIn构建LocalTime(Object instant)构造