docs: public static int lenIonTimestamp(Timestamp di)
      {
          if (di == null) return 0;
  
          int len = 0;
          switch (di.getPrecision()) {
          case FRACTION:
          case SECOND:
          {
              BigDecimal fraction = di.getFractionalSecond();
              if (fraction != null)
              {
                  assert fraction.signum() >=0 && ! fraction.equals(BigDecimal.ZERO)
                      : "Bad timestamp fraction: " + fraction;
  
                  // Since the fraction is not 0d0, at least one subfield of the
                  // exponent and mantissa is non-zero, so this will always write at
                  // least one byte.
                  int fracLen = IonBinary.lenIonDecimal(fraction);
                  assert fracLen > 0;
                  len += fracLen;
              }
  
              len++; // len of seconds < 60
          }
          case MINUTE:
              len += 2; // len of hour and minutes (both < 127)
          case DAY:
              len += 1; // len of month and day (both < 127)
          case MONTH:
              len += 1; // len of month and day (both < 127)
          case YEAR:
              len += IonBinary.lenVarUInt(di.getZYear());
          }
          Integer offset = di.getLocalOffset();
          if (offset == null) {
              len++; // room for the -0 (i.e. offset is "no specified offset")
          }
          else if (offset == 0) {
              len++;
          }
          else {
              len += IonBinary.lenVarInt(offset.longValue());
          }
          return len;
      }