code: public static long getTimestampMillis(Binary timestampBinary) {
      if (timestampBinary.length() != BYTES_IN_INT96_TIMESTAMP) {
        throw new IllegalArgumentException("Parquet timestamp must be 12 bytes long, actual " + timestampBinary.length());
      }
      byte[] bytes = timestampBinary.getBytes();
  
      // little endian encoding - bytes are red in inverted order
      long timeOfDayNanos = TypeUtils.longFromBytes(bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]);
      int julianDay = TypeUtils.intFromBytes(bytes[11], bytes[10], bytes[9], bytes[8]);
  
      return julianDayToMillis(julianDay) + (timeOfDayNanos / NANOS_PER_MILLISECOND);
    }
docs: Returns GMT timestamp from binary encoded parquet timestamp (12 bytes - julian date + time of day nanos).
  
  @param timestampBinary INT96 parquet timestamp
  @return timestamp in millis, GMT timezone