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(")\\/\""); } }