只比较Date的时间部分



考虑以下代码,仅确定一个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 );
}

这会确保时间比较是正确的吗?是否有更好的选择(Joda不是一个选项)?我认为这相当于将Calendar对象设置为当前日期/时间,然后手动复制小时、分钟和毫秒组件。您可以假设时区是相同的。

编辑:为了澄清我只比较Date对象的时间分量的意思。我的意思是,当具体观察时间部分时,开始时间在停止时间之前。日期部分是绝对无关的(在开始="1月2日20011上午10点"和结束="1月1日2011上午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;
}

[编辑]

假设日期具有相同的时区偏移量。如果没有,您必须事先手动调整它们(或作为此函数的一部分)。

一天有86400,000毫秒,为什么不直接用它来计算呢?你可以用这个数字修改timeInMilliseconds,然后比较结果。