code: public long toEpochMilli() {
          if (seconds >= 0) {
              long millis = Jdk8Methods.safeMultiply(seconds, MILLIS_PER_SEC);
              return Jdk8Methods.safeAdd(millis, nanos / NANOS_PER_MILLI);
          } else {
              // prevent an overflow in seconds * 1000
              // instead of going form the second farther away from 0
              // going toward 0
              // we go from the second closer to 0 away from 0
              // that way we always stay in the valid long range
              // seconds + 1 can not overflow because it is negative
              long millis = Jdk8Methods.safeMultiply(seconds + 1, MILLIS_PER_SEC);
              return Jdk8Methods.safeSubtract(millis, (MILLIS_PER_SEC - nanos / NANOS_PER_MILLI));
          }
      }
docs: Converts this instant to the number of milliseconds from the epoch
  of 1970-01-01T00:00:00Z.
  <p>
  If this instant represents a point on the time-line too far in the future
  or past to fit in a {@code long} milliseconds, then an exception is thrown.
  <p>
  If this instant has greater than millisecond precision, then the conversion
  will drop any excess precision information as though the amount in nanoseconds
  was subject to integer division by one million.
  
  @return the number of milliseconds since the epoch of 1970-01-01T00:00:00Z
  @throws ArithmeticException if numeric overflow occurs