Пример #1
0
        internal static void WriteValue(DateTime value, JsonSerializerHandler handler)
        {
            if (handler.Option.DatetimeFormat == DatetimeFormatEnum.ISO8601)
            {
                // "yyyy-mm-ddThh:mm:ss.fffffffZ"
                // 0123456789ABCDEFGHIJKL
                //
                // Yes, DateTime.Max is in fact guaranteed to have a 4 digit year (and no more)
                // f of 7 digits allows for 1 Tick level resolution
                char[] buffer = new char[36];
                buffer[0] = '"';

                // Year
                uint val    = (uint)value.Year;
                var  digits = DigitPairs[(byte)(val % 100)];
                buffer[4] = digits.Second;
                buffer[3] = digits.First;
                digits    = DigitPairs[(byte)(val / 100)];
                buffer[2] = digits.Second;
                buffer[1] = digits.First;

                // delimiter
                buffer[5] = '-';

                // Month
                digits    = DigitPairs[value.Month];
                buffer[7] = digits.Second;
                buffer[6] = digits.First;

                // Delimiter
                buffer[8] = '-';

                // Day
                digits     = DigitPairs[value.Day];
                buffer[10] = digits.Second;
                buffer[9]  = digits.First;

                // Delimiter
                buffer[11] = 'T';

                digits     = DigitPairs[value.Hour];
                buffer[13] = digits.Second;
                buffer[12] = digits.First;

                // Delimiter
                buffer[14] = ':';

                digits     = DigitPairs[value.Minute];
                buffer[16] = digits.Second;
                buffer[15] = digits.First;

                // Delimiter
                buffer[17] = ':';

                digits     = DigitPairs[value.Second];
                buffer[19] = digits.Second;
                buffer[18] = digits.First;

                int fracEnd;
                var remainingTicks = (value - new DateTime(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second)).Ticks;
                if (remainingTicks > 0)
                {
                    buffer[20] = '.';

                    var fracPart = remainingTicks % 100;
                    remainingTicks /= 100;
                    if (fracPart > 0)
                    {
                        digits     = DigitPairs[fracPart];
                        buffer[27] = digits.Second;
                        buffer[26] = digits.First;
                        fracEnd    = 28;
                    }
                    else
                    {
                        fracEnd = 26;
                    }

                    fracPart        = remainingTicks % 100;
                    remainingTicks /= 100;
                    if (fracPart > 0)
                    {
                        digits     = DigitPairs[fracPart];
                        buffer[25] = digits.Second;
                        buffer[24] = digits.First;
                    }
                    else
                    {
                        if (fracEnd == 26)
                        {
                            fracEnd = 24;
                        }
                        else
                        {
                            buffer[25] = '0';
                            buffer[24] = '0';
                        }
                    }

                    fracPart        = remainingTicks % 100;
                    remainingTicks /= 100;
                    if (fracPart > 0)
                    {
                        digits     = DigitPairs[fracPart];
                        buffer[23] = digits.Second;
                        buffer[22] = digits.First;
                    }
                    else
                    {
                        if (fracEnd == 24)
                        {
                            fracEnd = 22;
                        }
                        else
                        {
                            buffer[23] = '0';
                            buffer[22] = '0';
                        }
                    }

                    fracPart   = remainingTicks;
                    buffer[21] = (char)('0' + fracPart);
                }
                else
                {
                    fracEnd = 20;
                }

                buffer[fracEnd]     = 'Z';
                buffer[fracEnd + 1] = '"';

                handler.WriteChars(buffer, 0, fracEnd + 2);
            }
            else if (handler.Option.DatetimeFormat == DatetimeFormatEnum.RFC1123)
            {
                // ddd, dd MMM yyyy HH:mm:ss GMT'"
                handler.WriteChar('"');

                // compiles as a switch
                switch (value.DayOfWeek)
                {
                case DayOfWeek.Sunday: handler.WriteString("Sun, "); break;

                case DayOfWeek.Monday: handler.WriteString("Mon, "); break;

                case DayOfWeek.Tuesday: handler.WriteString("Tue, "); break;

                case DayOfWeek.Wednesday: handler.WriteString("Wed, "); break;

                case DayOfWeek.Thursday: handler.WriteString("Thu, "); break;

                case DayOfWeek.Friday: handler.WriteString("Fri, "); break;

                case DayOfWeek.Saturday: handler.WriteString("Sat, "); break;
                }

                {
                    var day = DigitPairs[value.Day];
                    handler.WriteChar(day.First);
                    handler.WriteChar(day.Second);
                    handler.WriteChar(' ');
                }

                // compiles as a switch
                switch (value.Month)
                {
                case 1: handler.WriteString("Jan "); break;

                case 2: handler.WriteString("Feb "); break;

                case 3: handler.WriteString("Mar "); break;

                case 4: handler.WriteString("Apr "); break;

                case 5: handler.WriteString("May "); break;

                case 6: handler.WriteString("Jun "); break;

                case 7: handler.WriteString("Jul "); break;

                case 8: handler.WriteString("Aug "); break;

                case 9: handler.WriteString("Sep "); break;

                case 10: handler.WriteString("Oct "); break;

                case 11: handler.WriteString("Nov "); break;

                case 12: handler.WriteString("Dec "); break;
                }

                {
                    var year          = value.Year;
                    var firstHalfYear = DigitPairs[year / 100];
                    handler.WriteChar(firstHalfYear.First);
                    handler.WriteChar(firstHalfYear.Second);

                    var secondHalfYear = DigitPairs[year % 100];
                    handler.WriteChar(secondHalfYear.First);
                    handler.WriteChar(secondHalfYear.Second);
                    handler.WriteChar(' ');
                }

                {
                    var hour = DigitPairs[value.Hour];
                    handler.WriteChar(hour.First);
                    handler.WriteChar(hour.Second);
                    handler.WriteChar(':');
                }

                {
                    var minute = DigitPairs[value.Minute];
                    handler.WriteChar(minute.First);
                    handler.WriteChar(minute.Second);
                    handler.WriteChar(':');
                }

                {
                    var second = DigitPairs[value.Second];
                    handler.WriteChar(second.First);
                    handler.WriteChar(second.Second);
                }

                handler.WriteString(" GMT\"");
            }
            else if (handler.Option.DatetimeFormat == DatetimeFormatEnum.Microsoft)
            {
                /*
                 *  "\/Date(628318530718)\/"
                 */
                handler.WriteString("\"\\/Date(");
                handler.WriteLong((value.Ticks - 621355968000000000L) / 10000L);
                handler.WriteString(")\\/\"");
            }
        }