请考虑以下代码,仅确定一个Date对象的时间组件是否在另一个Date对象的时间组件之前:
private boolean validStartStopTime( Date start, Date stop ) {
Calendar startCal = Calendar.getInstance();
Calendar stopCal = Calendar.getInstance();
startCal.clear();
stopCal.clear();
startCal.setTime( start );
stopCal.setTime( stop );
startCal.set( Calendar.YEAR, 2011 );
stopCal.set( Calendar.YEAR, 2011 );
startCal.set( Calendar.MONTH, 1 );
stopCal.set( Calendar.MONTH, 1 );
startCal.set( Calendar.DAY_OF_YEAR, 1 );
stopCal.set( Calendar.DAY_OF_YEAR, 1 );
return startCal.before( stopCal );
}
Run Code Online (Sandbox Code Playgroud)
这会确保时间比较是正确的吗?有没有更好的选择(Joda不是一个选择)?我相信这相当于将Calendar
对象设置为当前日期/时间并手动复制小时,分钟和毫秒组件.您可以假设时区是相同的.
编辑:通过仅比较Date
对象的时间组件来澄清我的意思.我的意思是,当专门查看时间部分时,开始时间是在停止时间之前.日期部分绝对不相关(在那个开始="1月2日20011 10AM"和结束="2011年1月1日上午11点"非常好),如果我有一个选择我只是使用只包含时间而是一个Date
对象的东西是我给的.我不想写一个if-else的序列,这就是我采用上述方法的原因,但我欢迎更清洁/更好的方法.
你的代码应该工作正常.你也可以在一个从零开始的一串标记格式只是时间组件,并将它们按字典比较:
public static boolean timeIsBefore(Date d1, Date d2) {
DateFormat f = new SimpleDateFormat("HH:mm:ss.SSS");
return f.format(d1).compareTo(f.format(d2)) < 0;
}
Run Code Online (Sandbox Code Playgroud)
[编辑]
这假设日期具有相同的时区偏移量.如果不是,您必须事先手动调整它们(或作为此功能的一部分).