protected void processValue(Object value) {
    if (ExpressionUtils.isError(value)) {
      hasError = true;
    } else if (ExpressionUtils.isNonBlankData(value)) {
      if (value instanceof Calendar) {
        value = ((Calendar) value).getTime();
      }

      if (value instanceof Date) {
        long t = ((Date) value).getTime();
        hasTime = true;

        int bin = (int) Math.floor((double) (t - _index.getMin()) / (double) _index.getStep());
        if (bin >= 0 && bin < bins.length) { // as a precaution
          bins[bin]++;
        }
      } else {
        hasNonTime = true;
      }
    } else {
      hasBlank = true;
    }
  }
 public ExpressionTimeValueBinner(RowEvaluable rowEvaluable, TimeBinIndex index) {
   _rowEvaluable = rowEvaluable;
   _index = index;
   bins = new int[_index.getBins().length];
 }