@Specialization public RubyTime timeSDup(RubyTime other) { final RubyTime time = new RubyTime( getContext().getCoreLibrary().getTimeClass(), other.getDateTime(), other.getOffset()); return time; }
@Specialization public Object timeUTCOffset(RubyTime time) { Object offset = time.getOffset(); if (offset != nil()) { return offset; } else { return time.getDateTime().getZone().getOffset(time.getDateTime().getMillis()) / 1_000; } }
@Specialization public RubyBasicObject timeDecompose(VirtualFrame frame, RubyTime time) { CompilerDirectives.transferToInterpreter(); final DateTime dateTime = time.getDateTime(); final int sec = dateTime.getSecondOfMinute(); final int min = dateTime.getMinuteOfHour(); final int hour = dateTime.getHourOfDay(); final int day = dateTime.getDayOfMonth(); final int month = dateTime.getMonthOfYear(); final int year = dateTime.getYear(); int wday = dateTime.getDayOfWeek(); if (wday == 7) { wday = 0; } final int yday = dateTime.getDayOfYear(); final boolean isdst = false; final String envTimeZoneString = readTimeZoneNode.executeRubyString(frame).toString(); String zoneString = org.jruby.RubyTime.zoneHelper(envTimeZoneString, dateTime, false); Object zone; if (zoneString.matches(".*-\\d+")) { zone = nil(); } else { zone = createString(zoneString); } final Object[] decomposed = new Object[] {sec, min, hour, day, month, year, wday, yday, isdst, zone}; return createArray(decomposed, decomposed.length); }
@TruffleBoundary @Specialization public RubyBasicObject timeStrftime(RubyTime time, RubyString format) { final RubyDateFormatter rdf = getContext().getRuntime().getCurrentContext().getRubyDateFormatter(); // TODO CS 15-Feb-15 ok to just pass nanoseconds as 0? return createString( rdf.formatToByteList( rdf.compilePattern(StringNodes.getByteList(format), false), time.getDateTime(), 0, null)); }
@Specialization public long timeSetNSeconds(RubyTime time, int nanoseconds) { time.setDateTime(time.getDateTime().withMillisOfSecond(nanoseconds / 1_000_000)); return nanoseconds; }
@Specialization public long timeNSeconds(RubyTime time) { return time.getDateTime().getMillisOfSecond() * 1_000_000L; }
@Specialization public long timeSeconds(RubyTime time) { return time.getDateTime().getMillis() / 1_000; }