/**
  * Create a ZonedChronology for any chronology, overriding any time zone it may already have.
  *
  * @param base base chronology to wrap
  * @param zone the time zone
  * @throws IllegalArgumentException if chronology or time zone is null
  */
 public static ZonedChronology getInstance(Chronology base, DateTimeZone zone) {
   if (base == null) {
     throw new IllegalArgumentException("Must supply a chronology");
   }
   base = base.withUTC();
   if (base == null) {
     throw new IllegalArgumentException("UTC chronology must not be null");
   }
   if (zone == null) {
     throw new IllegalArgumentException("DateTimeZone must not be null");
   }
   return new ZonedChronology(base, zone);
 }
 private void printTo(Appendable appendable, long instant, Chronology chrono) throws IOException {
   InternalPrinter printer = requirePrinter();
   chrono = selectChronology(chrono);
   // Shift instant into local time (UTC) to avoid excessive offset
   // calculations when printing multiple fields in a composite printer.
   DateTimeZone zone = chrono.getZone();
   int offset = zone.getOffset(instant);
   long adjustedInstant = instant + offset;
   if ((instant ^ adjustedInstant) < 0 && (instant ^ offset) >= 0) {
     // Time zone offset overflow, so revert to UTC.
     zone = DateTimeZone.UTC;
     offset = 0;
     adjustedInstant = instant;
   }
   printer.printTo(appendable, adjustedInstant, chrono.withUTC(), offset, zone, iLocale);
 }