首先原谅我的英语: - (
我在java上有几个小时的问题。让我们通过一个例子来看待它:
DateFormat datos = new SimpleDateFormat ("hh:mm:ss");
Date ac, lim;
String actual,limit;
actual="18:01:23";
limit="00:16:23";
ac=datos.parse(actual);
lim=datos.parse(limit);
if(ac.compareTo(lim)==-1){.......
我需要解决这种情况,其中限制已经过了午夜,而实际小时则是午夜之前。我的程序说实际已经达到极限并且不正确,因为在这个例子中,它仍然需要6个小时才能完成。
我尝试用DateFormat类解决它,但它没有看到这种情况。我也尝试使用Time类,但不推荐使用它的方法。
我该如何解决这个问题?
答案 0 :(得分:13)
在HH
:
hh
代替SimpleDateFormat
DateFormat datos = new SimpleDateFormat("HH:mm:ss");
hh
是12小时制(小时数从1到12)。
HH
是24小时制(小时数从0到23)。
但除此之外,还有其他问题。类Date
不太适合仅包含时间。如果这样做,它将在指定的时间内解析为01-01-1970。所以18:01:23变成01-01-1970,18:01:23和00:16:23变成01-01-1970,00:16:23。你可能想在第二天比较18:01:23到00:16:23。
尝试这样的事情:
String actual = "18:01:23";
String limit = "00:16:23";
String[] parts = actual.split(":");
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0]));
cal1.set(Calendar.MINUTE, Integer.parseInt(parts[1]));
cal1.set(Calendar.SECOND, Integer.parseInt(parts[2]));
parts = limit.split(":");
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0]));
cal2.set(Calendar.MINUTE, Integer.parseInt(parts[1]));
cal2.set(Calendar.SECOND, Integer.parseInt(parts[2]));
// Add 1 day because you mean 00:16:23 the next day
cal2.add(Calendar.DATE, 1);
if (cal1.before(cal2)) {
System.out.println("Not yet at the limit");
}
库Joda Time是一个流行的Java日期和时间库,它比标准的Java日期和日历API设计得更好;如果你必须使用Java中的日期和时间,请考虑使用它。
使用Joda Time,您可以这样做:
String actual = "18:01:23";
String limit = "00:16:23";
DateTimeFormatter df = DateTimeFormat.forPattern("HH:mm:ss");
DateTime ac = df.parseLocalTime(actual).toDateTimeToday();
DateTime lim = df.parseLocalTime(limit).toDateTimeToday().plusDays(1);
if (ac.isBefore(lim)) {
System.out.println("Not yet at the limit");
}
答案 1 :(得分:0)
快速而肮脏的解决方案:
final DateFormat datos = new SimpleDateFormat("HH:mm:ss");
Date ac;
final Date lim = new Date();
String actual, limit;
actual = "18:01:23";
limit = "00:16:23";
try {
ac = datos.parse(actual);
lim.setTime(ac.getTime() + TimeUnit.MINUTES.toMillis(16) + TimeUnit.SECONDS.toMillis(23));
if ( ac.before(lim) ) {
// TODO
}
} catch ( final ParseException e ) {
e.printStackTrace();
}