/* * call-seq: * time.strftime( string ) => string * * Formats <i>time</i> according to the directives in the given format * string. Any text not listed as a directive will be passed through * to the output string. * * Format meaning: * %a - The abbreviated weekday name (``Sun'') * %A - The full weekday name (``Sunday'') * %b - The abbreviated month name (``Jan'') * %B - The full month name (``January'') * %c - The preferred local date and time representation * %d - Day of the month (01..31) * %H - Hour of the day, 24-hour clock (00..23) * %I - Hour of the day, 12-hour clock (01..12) * %j - Day of the year (001..366) * %m - Month of the year (01..12) * %M - Minute of the hour (00..59) * %p - Meridian indicator (``AM'' or ``PM'') * %S - Second of the minute (00..60) * %U - Week number of the current year, * starting with the first Sunday as the first * day of the first week (00..53) * %W - Week number of the current year, * starting with the first Monday as the first * day of the first week (00..53) * %w - Day of the week (Sunday is 0, 0..6) * %x - Preferred representation for the date alone, no time * %X - Preferred representation for the time alone, no date * %y - Year without a century (00..99) * %Y - Year with century * %Z - Time zone name * %% - Literal ``%'' character * * t = Time.now * t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" * t.strftime("at %I:%M%p") #=> "at 08:56AM" */ static VALUE time_strftime(time, format) VALUE time, format; { struct time_object *tobj; char buffer[SMALLBUF], *buf = buffer; const char *fmt; long len; VALUE str; GetTimeval(time, tobj); if (tobj->tm_got == 0) { time_get_tm(time, tobj->gmt); } StringValue(format); format = rb_str_new4(format); fmt = RSTRING(format)->ptr; len = RSTRING(format)->len; if (len == 0) { rb_warning("strftime called with empty format string"); } else if (strlen(fmt) < len) { /* Ruby string may contain \0's. */ const char *p = fmt, *pe = fmt + len; str = rb_str_new(0, 0); while (p < pe) { len = rb_strftime(&buf, p, &tobj->tm); rb_str_cat(str, buf, len); p += strlen(p); if (buf != buffer) { free(buf); buf = buffer; } for (fmt = p; p < pe && !*p; ++p); if (p > fmt) rb_str_cat(str, fmt, p - fmt); } return str; } else { len = rb_strftime(&buf, RSTRING(format)->ptr, &tobj->tm); } str = rb_str_new(buf, len); if (buf != buffer) free(buf); return str; }