我有一些时间Strings
,如"09:00"
和"17:30"
,我需要检查当前时间是否在该范围内。
我想我可以做这样的比较:
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
Date begin;
Date end;
begin = format.parse(begin_string);
end = format.parse(end_string);
if (now.compareTo(begin) > 0 && end.compareTo(now) > 0)
return true;
else
return false;
结果是,当我解析字符串时,时间被正确解析,但是日期被设置为1970年1月1日。这样,代码将始终返回false
。
我想知道如何将begin
和end
设置为当前日期,但时间来自它们的字符串。
您也可以像这样重用当前时间的格式对象:
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date now = new Date();
String time = format.format(now); // format to wall time loosing current date
System.out.println(time);
now = format.parse(time); // reparse wall time
System.out.println(now);
因此,您可以使用隐式使用系统的标准时区将now
转换为1970,然后可以使用它与begin
和end
进行直接比较。
Date begin = format.parse("09:00");
Date end = format.parse("21:30");
return (begin.before(now) && end.after(now)); // open-bounded interval
- 获取当前时间,
Calendar.getInstance();
- 获取另外2个当前时间实例,并根据输入设置时间字段
Calendar.set(Calendar.HOUR_OF_DAY, 1);
- 和调用
compare()
在时间边界
您应该真正使用日历。然后,您可以根据从字符串解析的值分别设置小时和分钟。然后得到以毫秒为单位的时间,并比较它们。
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
long time = cal.getTimeInMillis();
您还可以使用出色的Joda库。在我看来,Joda是处理日期和时间的一种更好的方式。
打包的java.util.Date &日历类是出了名的麻烦。避免它们。使用jdbc - time库或新的java。Java 8中的time包(灵感来自JSR 310定义的Joda-Time)。
如果您真的不关心时区或日期,可以使用Joda-Time LocalTime类或java。time LocalTime类。
警告:Naïve程序员通常认为他们只需要本地时间,因此可以忽略时区,但后来会后悔自己的立场。
<标题> Joda-Time h1> 果您的时间是正确的ISO 8601格式(24小时,正确的位数),那么您可以直接将字符串输入传递给LocalTime的构造函数,而不必费心解析。这个类有一个内置的ISO 8601风格的解析器。String inputStart = "09:00";
String inputStop = "17:30";
LocalTime start = new LocalTime( inputStart );
LocalTime stop = new LocalTime( inputStop );
LocalTime now = LocalTime.now();
// Comparing using Half-Open logic, where beginning is inclusive and ending is exclusive.
boolean isNowContainedWithinInterval = ( ( now.isEqual( start ) ) || ( now.isAfter( start ) ) ) && ( now.isBefore( stop ) );
转储到控制台…
System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "now: " + now );
System.out.println( "isNowContainedWithinInterval: " + isNowContainedWithinInterval );
运行时……
start: 09:00:00.000
stop: 17:30:00.000
now: 12:42:06.567
isNowContainedWithinInterval: true
在现实世界中,我将添加一个断言测试来证明停止时间晚于开始时间,以验证输入
标题>