示例#1
0
        private static void FormatDayOfWeek(MutableString /*!*/ result, DateTime dateTime, int start)
        {
            DateTime firstDay    = dateTime.AddDays(1 - dateTime.DayOfYear);
            DateTime firstSunday = firstDay.AddDays((start - (int)firstDay.DayOfWeek) % 7);
            int      week        = 1 + (int)Math.Floor((dateTime - firstSunday).Days / 7.0);

            result.AppendFormat("{0:00}", week);
        }
示例#2
0
        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);
        }