我不知道这里发生了什么:如果当前时间在给定范围之间,我需要返回true,例如:现在是15:45:00并且在12:00:00之间(分)和18:00:00(最大),但这种方法做错了:
private boolean verifyIfInside(String max, String min){
try {
DateFormat dateFormat = new SimpleDateFormat ("HH:mm:ss");
Date date = new Date();
String hour1 = min;
String hour2 = max;
String newHour = dateFormat.format(date);
Date minHour, maxHour, nowHour;
minHour = dateFormat.parse(hora1);
maxHour = dateFormat.parse(hora2);
nowHour = dateFormat.parse(newHour );
if ((minHour.compareTo(nowHour) <= 0) && (maxHour.compareTo(nowHour) >= 0)){
return true;
} else {
return false;
}
} catch (ParseException parseException){
parseException.printStackTrace();
return false;
}
}
答案 0 :(得分:0)
我已经使用 .before()和 .after()测试了它的工作正常,您还可以减少以下代码: -
private static boolean verifyIfInside(String min , String max){
try {
DateFormat dateFormat = new SimpleDateFormat ("HH:mm:ss");
String current_time = dateFormat.format(new Date());
Date minHour = dateFormat.parse(min);
Date maxHour = dateFormat.parse(max);
Date curr_time = dateFormat.parse(current_time);
return minHour.before(curr_time) && maxHour.after(curr_time);
} catch (ParseException parseException){
parseException.printStackTrace();
return false;
}
}
答案 1 :(得分:0)
Date
,DateFormat
和SimpleDateFormat
不仅已过时,特别是最后一个也因使用起来很麻烦而闻名。相反,我建议您使用现代Java日期和时间API java.time
。这甚至提供LocalTime
课程,一天中没有日期的时间,比Date
更精确地符合您的需要。所以你的方法写得清楚而简洁:
private static boolean verifyIfInside(String max, String min) {
LocalTime now = LocalTime.now(ZoneId.of("Europe/Budapest"));
LocalTime minHour = LocalTime.parse(min);
LocalTime maxHour = LocalTime.parse(max);
return ! (now.isBefore(minHour) || now.isAfter(maxHour));
}
如果不是欧洲/布达佩斯,请替换您想要的时区。
由于我理解你希望你的范围具有包容性,并且由于isBefore
和isAfter
严格意味着之前和之后,我使用否定来测试时间是“不在范围之外”
我进一步利用了这样一个事实:你的时间格式12:00:00
与ISO 8601一致,即现代类解析为默认格式,即没有任何明确的格式化程序。潜在的缺点是时间字符串的验证较弱:parse()
也会接受12:00
和12:23:29.82376342
。如果您需要将这些作为错误拒绝,则需要一个明确的格式化程序。
据我所知,问题中的代码工作正常(如果我们只是将hora1
更改为hour1
,反之亦然,hora2
也是如此。您可能对参数的顺序感到困惑。如果在12到18之间运行,则以下内容返回true:verifyIfInside("18:00:00", "12:00:00")
。但是,许多人会发现将调用写为verifyIfInside("12:00:00", "18:00:00")
是很自然的,它总是返回false。因此,将方法声明为verifyIfInside(String min, String max)
几乎肯定会更好,即min
之前的max
。
当然,正如我所提到的,另一种可能性是,您的JVM正在使用与您认为正在使用的时区不同的时区。这很可能会给你意想不到的结果。唯一可以确定不是这种情况的方法是明确指定应该使用哪个时区。
答案 2 :(得分:-1)
它可以正常使用建议的修改:
.before()
和.after()
来比较当前小时是在小时之后和最大小时之前。!nowHour.after(maxHour) && !nowHour.before(minHour);
nowHour.after(minHour) && nowHour.before(maxHour);
代码:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class scratch_21 {
public static void main(String[] args) {
System.out.println(verifyIfInside("14:00:00", "14:15:00"));
}
private static boolean verifyIfInside(String min, String max) {
try {
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
String hora1 = min;
String hora2 = max;
String newHour = dateFormat.format(date);
Date minHour, maxHour, nowHour;
minHour = dateFormat.parse(hora1);
maxHour = dateFormat.parse(hora2);
nowHour = dateFormat.parse(newHour);
return nowHour.after(minHour) && nowHour.before(maxHour);
} catch (ParseException parseException) {
parseException.printStackTrace();
return false;
}
}
}