fn time_utc(vm: &mut VM, self_val: Value, args: &Args2) -> VMResult {
    args.check_args_range(1, 8)?;
    let (y, m, d, h, min, sec, usec) = match args.len() {
        1 => (vm[0].coerce_to_fixnum("Args")?, 1, 1, 0, 0, 0, 0),
        2 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            1,
            0,
            0,
            0,
            0,
        ),
        3 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            vm[2].coerce_to_fixnum("Args")?,
            0,
            0,
            0,
            0,
        ),
        4 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            vm[2].coerce_to_fixnum("Args")?,
            vm[3].coerce_to_fixnum("Args")?,
            0,
            0,
            0,
        ),
        5 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            vm[2].coerce_to_fixnum("Args")?,
            vm[3].coerce_to_fixnum("Args")?,
            vm[4].coerce_to_fixnum("Args")?,
            0,
            0,
        ),
        6 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            vm[2].coerce_to_fixnum("Args")?,
            vm[3].coerce_to_fixnum("Args")?,
            vm[4].coerce_to_fixnum("Args")?,
            vm[5].coerce_to_fixnum("Args")?,
            0,
        ),
        7 => (
            vm[0].coerce_to_fixnum("Args")?,
            vm[1].coerce_to_fixnum("Args")?,
            vm[2].coerce_to_fixnum("Args")?,
            vm[3].coerce_to_fixnum("Args")?,
            vm[4].coerce_to_fixnum("Args")?,
            vm[5].coerce_to_fixnum("Args")?,
            vm[6].coerce_to_fixnum("Args")?,
        ),
        _ => unreachable!(),
    };
    let native_dt = NaiveDate::from_ymd_opt(y as i32, m as u32, d as u32)
        .ok_or_else(|| RubyError::argument("Out of range."))?
        .and_hms_micro_opt(h as u32, min as u32, sec as u32, usec as u32)
        .ok_or_else(|| RubyError::argument("Out of range."))?;
    let time = TimeInfo::UTC(DateTime::<Utc>::from_naive_utc_and_offset(native_dt, Utc));
    Ok(Value::time(Module::new(self_val), time))
}
Time.gm(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> time
Time.utc(year, mon = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) -> time
https://docs.ruby-lang.org/ja/latest/method/Time/s/gm.html
ruruby/src/builtin/time.rs