我真的不知道我的代码有什么问题。我在这个案子上使用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;
美好的一天,并提前感谢你。
答案 0 :(得分:3)
日期组件应设置为"零时代" 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;
}
它显然有其局限性。如果时间间隔几天,它将无法工作。最后,如果在timeIn
和timeOut
之间有夏季时间(夏令时)过渡,您知道自己想要的结果吗?
你认为你是那个问这个问题的人。 ; - )
浏览the documentation of org.joda.time.LocalTime
在我看来,您可以以非常类似的方式使用该类,使用no-arg构造函数构建timeOut
,使用timeIn
构建LocalTime(Object instant)
构造