public static MutableString /*!*/ FormatTime(RubyContext /*!*/ context, RubyTime /*!*/ self, [DefaultProtocol, NotNull] MutableString /*!*/ format) { MutableString result = MutableString.CreateMutable(format.Encoding); bool inFormat = false; var charEnum = format.GetCharacters(); while (charEnum.MoveNext()) { var character = charEnum.Current; int c = character.IsValid ? character.Value : -1; if (!inFormat) { if (c == '%') { inFormat = true; } else { result.Append(character); } continue; } inFormat = false; string dateTimeFormat = null; switch (c) { case '%': result.Append('%'); break; case 'a': dateTimeFormat = "ddd"; break; case 'A': dateTimeFormat = "dddd"; break; case 'b': dateTimeFormat = "MMM"; break; case 'B': dateTimeFormat = "MMMM"; break; case 'c': dateTimeFormat = "g"; break; case 'd': dateTimeFormat = "dd"; break; case 'D': dateTimeFormat = "MM/dd/yy"; break; case 'e': { // Day of the month, blank-padded ( 1..31) int day = self.DateTime.Day; if (day < 10) { result.Append(' '); } result.Append(day.ToString(CultureInfo.InvariantCulture)); break; } case 'H': dateTimeFormat = "HH"; break; case 'I': dateTimeFormat = "hh"; break; case 'j': result.AppendFormat("{0:000}", self.DateTime.DayOfYear); break; case 'l': { int hour = self.DateTime.Hour; if (hour == 0) { hour = 12; } else if (hour > 12) { hour -= 12; } if (hour < 10) { result.Append(' '); } result.Append(hour.ToString(CultureInfo.InvariantCulture)); break; } case 'm': dateTimeFormat = "MM"; break; case 'M': dateTimeFormat = "mm"; break; case 'p': dateTimeFormat = "tt"; break; case 'S': dateTimeFormat = "ss"; break; case 'T': dateTimeFormat = "HH:mm:ss"; break; case 'U': FormatDayOfWeek(result, self.DateTime, 7); break; case 'W': FormatDayOfWeek(result, self.DateTime, 8); break; case 'w': result.Append(((int)self.DateTime.DayOfWeek).ToString(CultureInfo.InvariantCulture)); break; case 'x': dateTimeFormat = "d"; break; case 'X': dateTimeFormat = "t"; break; case 'y': dateTimeFormat = "yy"; break; case 'Y': dateTimeFormat = "yyyy"; break; case 'Z': dateTimeFormat = "%K"; break; case 'z': if (context.RubyOptions.Compatibility > RubyCompatibility.Ruby186) { result.Append(self.FormatUtcOffset()); } else { result.Append(RubyTime.GetCurrentZoneName()); } break; default: if (context.RubyOptions.Compatibility > RubyCompatibility.Ruby186) { result.Append(character); break; } return(MutableString.CreateEmpty()); } if (dateTimeFormat != null) { result.Append(self.ToString(dateTimeFormat, CultureInfo.InvariantCulture)); } } if (inFormat) { if (context.RubyOptions.Compatibility > RubyCompatibility.Ruby186) { return(result.Append('%')); } return(MutableString.CreateEmpty()); } return(result); }