仅比较Date的时间组件

时间:2011-08-08 21:16:14

标签: java 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 10AM”和结束=“2011年1月1日上午11点”完全没问题),如果我有一个选择,我只会使用只包含时间的东西,但{ {1}}对象就是我给的。我不想写一个if-else的序列,这就是我采用上述方法的原因,但我欢迎更清洁/更好的方法。

2 个答案:

答案 0 :(得分:9)

您的代码应该可以正常运行。您还可以使用从零开始的字符串表示法中仅格式化时间组件,并按字典顺序对它们进行比较:

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;
}

<强> [编辑]

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

答案 1 :(得分:3)

一天有86,400,000毫秒,为什么不用它来解决这个问题呢? 您可以使用该数字修改timeInMilliseconds并比较结果。