docs: public static IRubyObject makeTime(Ruby runtime, Pointer str, int len) {
  //         System.err.println("makeTime(" + new String(str.buffer, str.start, len) + ")");
          int ptr = str.start;
          int pend = ptr + len;
          IRubyObject year = runtime.newFixnum(0);
          IRubyObject mon = runtime.newFixnum(0);
          IRubyObject day = runtime.newFixnum(0);
          IRubyObject hour = runtime.newFixnum(0);
          IRubyObject min = runtime.newFixnum(0);
          IRubyObject sec = runtime.newFixnum(0);
          IRubyObject addSec = runtime.newFixnum(0);
          long usec = 0;
  
          if(str.buffer[ptr] != 0 && ptr < pend) {
              year = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 4;
          if(str.buffer[ptr] != 0 && ptr < pend) {
              while(!Character.isDigit((char)str.buffer[ptr]) && ptr < pend) ptr++;
              mon = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 2;
          if(str.buffer[ptr] != 0 && ptr < pend) {
              while(!Character.isDigit((char)str.buffer[ptr]) && ptr < pend) ptr++;
              day = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 2;
          if(str.buffer[ptr] != 0 && ptr < pend) {
              while(!Character.isDigit((char)str.buffer[ptr]) && ptr < pend) ptr++;
              hour = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 2;
          if(str.buffer[ptr] != 0 && ptr < pend) {
              while(!Character.isDigit((char)str.buffer[ptr]) && ptr < pend) ptr++;
              min = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 2;
          if(str.buffer[ptr] != 0 && ptr < pend) {
              while(!Character.isDigit((char)str.buffer[ptr]) && ptr < pend) ptr++;
              sec = runtime.newFixnum(extractInt(str.buffer, ptr, pend));
          }
  
          ptr += 2;
          if(ptr < pend && str.buffer[ptr] == '.') {
              int end = ptr + 1;
              while(Character.isDigit((char)str.buffer[end]) && end < pend) end++;
              byte[] padded = new byte[]{'0', '0', '0', '0', '0', '0'};
              int begin = ptr+1;
              int extraSeconds = 0;
              if(end - begin > 6) {
                  extraSeconds = (end - begin) - 6;
                  begin += extraSeconds;
                  addSec = runtime.newFixnum(extractInt(str.buffer, begin - extraSeconds, begin));
              }
              System.arraycopy(str.buffer, begin, padded, 0, end - begin);
              try {
                  usec = Long.parseLong(new String(padded, 0, 6, "ISO-8859-1"));
              } catch(java.io.UnsupportedEncodingException e) {}
          } else {
              usec = 0;
          }
  
          while(ptr < pend && str.buffer[ptr] != 'Z' && str.buffer[ptr] != '+' && str.buffer[ptr] != '-' && str.buffer[ptr] != 0) {
              ptr++;
          }
  
          if(ptr < pend && (str.buffer[ptr] == '-' || str.buffer[ptr] == '+')) {
              int lenx = 1;
              while(ptr+lenx < pend && Character.isDigit((char)str.buffer[ptr+lenx])) {
                  lenx++;
              }
              if(str.buffer[ptr] == '+') {
                  ptr++;
                  lenx--;
              }
              try {
                  long tz_offset = Long.parseLong(new String(str.buffer, ptr, lenx, "ISO-8859-1")) * 3600;
                  ptr+=lenx;
                  while(ptr < pend && str.buffer[ptr] != ':' && str.buffer[ptr] != 0 ) {
                      ptr++;
                  }
                  if(ptr < pend && str.buffer[ptr] == ':') {
                      ptr++;
                      if(tz_offset < 0) {
                          tz_offset -= extractInt(str.buffer, ptr, pend) * 60;
                      } else {
                          tz_offset += extractInt(str.buffer, ptr, pend) * 60;
                      }
                  }
                  
                  IRubyObject time = runtime.getClass("Time").callMethod(runtime.getCurrentContext(), "utc", new IRubyObject[]{year,mon,day,hour,min,sec});
                  long tmp = RubyNumeric.num2long(time.callMethod(runtime.getCurrentContext(), "to_i")) - tz_offset;
                  return ((RubyTime)runtime.getClass("Time").callMethod(runtime.getCurrentContext(), "at", new IRubyObject[]{runtime.newFixnum(tmp), runtime.newFixnum(usec)})).op_plus(addSec);
              } catch(java.io.UnsupportedEncodingException e) {}
          } else {
              // Make UTC time
              return ((RubyTime)runtime.getClass("Time").callMethod(runtime.getCurrentContext(), "utc", new IRubyObject[]{year,mon,day,hour,min,sec,runtime.newFixnum(usec)})).op_plus(addSec);
          }
          System.err.println("oopsie, returning null");
          return null;
      }