A container class for timezone conversion.
Creates new Time::TM object from a Time object.
static VALUE tm_from_time(VALUE klass, VALUE time) { struct time_object *tobj; struct vtm vtm, *v; #ifdef TM_IS_TIME VALUE tm; struct time_object *ttm; GetTimeval(time, tobj); tm = time_s_alloc(klass); ttm = DATA_PTR(tm); v = &vtm; GMTIMEW(ttm->timew = tobj->timew, v); v->subsecx = INT2FIX(0); v->zone = Qnil; ttm->vtm = *v; ttm->tm_got = 1; TZMODE_SET_UTC(ttm); return tm; #else VALUE args[8]; int i = 0; GetTimeval(time, tobj); if (tobj->tm_got && TZMODE_UTC_P(tobj)) v = &tobj->vtm; else GMTIMEW(tobj->timew, v = &vtm); args[i++] = v->year; args[i++] = INT2FIX(v->mon); args[i++] = INT2FIX(v->mday); args[i++] = INT2FIX(v->hour); args[i++] = INT2FIX(v->min); args[i++] = INT2FIX(v->sec); switch (v->isdst) { case 0: args[i++] = Qfalse; break; case 1: args[i++] = Qtrue; break; default: args[i++] = Qnil; break; } args[i++] = w2v(rb_time_unmagnify(tobj->timew)); return rb_class_new_instance(i, args, klass); #endif }
Creates new Time::TM object.
static VALUE tm_initialize(int argc, VALUE *argv, VALUE tm) { #ifdef TM_IS_TIME struct time_object *tobj = DATA_PTR(tm); struct vtm vtm; rb_check_arity(argc, 6, 6); time_arg(argc, argv, &vtm); tobj->tzmode = TIME_TZMODE_UTC; tobj->timew = timegmw(&vtm); tobj->vtm = vtm; return tm; #else int i = 0; struct vtm vtm; wideval_t t; time_arg(argc, argv, &vtm); t = timegmw(&vtm); RSTRUCT_SET(tm, i++, INT2FIX(vtm.sec)); RSTRUCT_SET(tm, i++, INT2FIX(vtm.min)); RSTRUCT_SET(tm, i++, INT2FIX(vtm.hour)); RSTRUCT_SET(tm, i++, INT2FIX(vtm.mday)); RSTRUCT_SET(tm, i++, INT2FIX(vtm.mon)); RSTRUCT_SET(tm, i++, vtm.year); RSTRUCT_SET(tm, i++, INT2FIX(0)); switch (vtm.isdst) { case 0: RSTRUCT_SET(tm, i++, Qfalse); break; case 1: RSTRUCT_SET(tm, i++, Qtrue); break; default: RSTRUCT_SET(tm, i++, Qnil); break; } RSTRUCT_SET(tm, i++, w2v(rb_time_unmagnify(t))); return tm; #endif }
Returns a new Time object.
static VALUE tm_to_time(VALUE tm) { #ifdef TM_IS_TIME struct time_object *torig = get_timeval(tm); VALUE dup = time_s_alloc(rb_cTime); struct time_object *tobj = DATA_PTR(dup); *tobj = *torig; return dup; #else VALUE t[6]; const VALUE *p = RSTRUCT_CONST_PTR(tm); int i; for (i = 0; i < numberof(t); ++i) { t[i] = p[numberof(t) - 1 - i]; } return time_s_mkutc(numberof(t), t, rb_cTime); #endif }