我有一些时间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
设置为当前日期,但是将其设置为字符串的时间。
答案 0 :(得分:4)
您也可以像这样重复使用当前时间的格式对象:
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
答案 1 :(得分:2)
Calendar.getInstance();
例如:
Calendar.set(Calendar.HOUR_OF_DAY, 1);
compare()
答案 2 :(得分:1)
你应该真的使用Calendar。然后,您可以根据从字符串中解析的值单独设置小时和分钟。然后以毫秒为单位获取时间并进行比较。
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是一个更好的方式与日期和时代合作。
答案 3 :(得分:0)
捆绑的java.util.Date& .Calendar类是出了名的麻烦。避免他们。使用Joda-Time库或Java 8中的新java.time package(受Joda-Time启发,由JSR 310定义)。
如果您真的不关心时区或日期,请使用Joda-Time LocalTime班级或java.time LocalTime班级。
警告:天真的程序员通常认为他们只需要当地时间,因此可以忽略时区,但是后悔这个位置。
如果您的时间采用正确的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
在现实世界中,我会添加一个断言测试,证明停止时间晚于开始时间,以验证输入。