code: public long getDifferenceAsLong(long minuendInstant, long subtrahendInstant) {
          if (minuendInstant < subtrahendInstant) {
              return -getDifferenceAsLong(subtrahendInstant, minuendInstant);
          }
          
          long difference = (minuendInstant - subtrahendInstant) / iUnitMillis;
          if (add(subtrahendInstant, difference) < minuendInstant) {
              do {
                  difference++;
              } while (add(subtrahendInstant, difference) <= minuendInstant);
              difference--;
          } else if (add(subtrahendInstant, difference) > minuendInstant) {
              do {
                  difference--;
              } while (add(subtrahendInstant, difference) > minuendInstant);
          }
          return difference;
      }
docs: Computes the difference between two instants, as measured in the units
  of this field. Any fractional units are dropped from the result. Calling
  getDifference reverses the effect of calling add. In the following code:
  
  <pre>
  long instant = ...
  long v = ...
  long age = getDifferenceAsLong(add(instant, v), instant);
  </pre>
  
  The value 'age' is the same as the value 'v'.
  <p>
  The default implementation performs a guess-and-check algorithm using
  getDurationField().getUnitMillis() and the add() method. Subclasses are
  encouraged to provide a more efficient implementation.
  
  @param minuendInstant the milliseconds from 1970-01-01T00:00:00Z to
  subtract from
  @param subtrahendInstant the milliseconds from 1970-01-01T00:00:00Z to
  subtract off the minuend
  @return the difference in the units of this field