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;
美好的一天,提前谢谢你。
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;
}
它显然有其局限性。如果时间相隔几天,它将不起作用。最后,如果在 timeIn
和 timeOut
之间转换夏令时 (DST),您知道您想要什么结果吗?
你以为你就是问这个问题的人。 ;-)
略读 the documentation of org.joda.time.LocalTime
在我看来你可以以非常相似的方式使用 class,使用 no-arg 构造函数构造 timeOut
和 timeIn
使用 LocalTime(Object instant)
构造函数。
我真的不知道我的代码有什么问题。我在这种情况下使用 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;
美好的一天,提前谢谢你。
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;
}
它显然有其局限性。如果时间相隔几天,它将不起作用。最后,如果在 timeIn
和 timeOut
之间转换夏令时 (DST),您知道您想要什么结果吗?
你以为你就是问这个问题的人。 ;-)
略读 the documentation of org.joda.time.LocalTime
在我看来你可以以非常相似的方式使用 class,使用 no-arg 构造函数构造 timeOut
和 timeIn
使用 LocalTime(Object instant)
构造函数。