Replace custom DateTimeFormatter with ToString("r") or TryFormat (#5695)
This commit is contained in:
parent
27f3bd468c
commit
a25c7d95e3
|
|
@ -1,100 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using Microsoft.Extensions.Primitives;
|
|
||||||
|
|
||||||
namespace Microsoft.Net.Http.Headers
|
|
||||||
{
|
|
||||||
internal static class DateTimeFormatter
|
|
||||||
{
|
|
||||||
private static readonly DateTimeFormatInfo FormatInfo = CultureInfo.InvariantCulture.DateTimeFormat;
|
|
||||||
|
|
||||||
private static readonly string[] MonthNames = FormatInfo.AbbreviatedMonthNames;
|
|
||||||
private static readonly string[] DayNames = FormatInfo.AbbreviatedDayNames;
|
|
||||||
|
|
||||||
private static readonly int Rfc1123DateLength = "ddd, dd MMM yyyy HH:mm:ss GMT".Length;
|
|
||||||
private static readonly int QuotedRfc1123DateLength = Rfc1123DateLength + 2;
|
|
||||||
|
|
||||||
// ASCII numbers are in the range 48 - 57.
|
|
||||||
private const int AsciiNumberOffset = 0x30;
|
|
||||||
|
|
||||||
private const string Gmt = "GMT";
|
|
||||||
private const char Comma = ',';
|
|
||||||
private const char Space = ' ';
|
|
||||||
private const char Colon = ':';
|
|
||||||
private const char Quote = '"';
|
|
||||||
|
|
||||||
public static string ToRfc1123String(this DateTimeOffset dateTime)
|
|
||||||
{
|
|
||||||
return ToRfc1123String(dateTime, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ToRfc1123String(this DateTimeOffset dateTime, bool quoted)
|
|
||||||
{
|
|
||||||
var universal = dateTime.UtcDateTime;
|
|
||||||
|
|
||||||
var length = quoted ? QuotedRfc1123DateLength : Rfc1123DateLength;
|
|
||||||
var target = new InplaceStringBuilder(length);
|
|
||||||
|
|
||||||
if (quoted)
|
|
||||||
{
|
|
||||||
target.Append(Quote);
|
|
||||||
}
|
|
||||||
|
|
||||||
target.Append(DayNames[(int)universal.DayOfWeek]);
|
|
||||||
target.Append(Comma);
|
|
||||||
target.Append(Space);
|
|
||||||
AppendNumber(ref target, universal.Day);
|
|
||||||
target.Append(Space);
|
|
||||||
target.Append(MonthNames[universal.Month - 1]);
|
|
||||||
target.Append(Space);
|
|
||||||
AppendYear(ref target, universal.Year);
|
|
||||||
target.Append(Space);
|
|
||||||
AppendTimeOfDay(ref target, universal.TimeOfDay);
|
|
||||||
target.Append(Space);
|
|
||||||
target.Append(Gmt);
|
|
||||||
|
|
||||||
if (quoted)
|
|
||||||
{
|
|
||||||
target.Append(Quote);
|
|
||||||
}
|
|
||||||
|
|
||||||
return target.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AppendYear(ref InplaceStringBuilder target, int year)
|
|
||||||
{
|
|
||||||
target.Append(GetAsciiChar(year / 1000));
|
|
||||||
target.Append(GetAsciiChar(year % 1000 / 100));
|
|
||||||
target.Append(GetAsciiChar(year % 100 / 10));
|
|
||||||
target.Append(GetAsciiChar(year % 10));
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AppendTimeOfDay(ref InplaceStringBuilder target, TimeSpan timeOfDay)
|
|
||||||
{
|
|
||||||
AppendNumber(ref target, timeOfDay.Hours);
|
|
||||||
target.Append(Colon);
|
|
||||||
AppendNumber(ref target, timeOfDay.Minutes);
|
|
||||||
target.Append(Colon);
|
|
||||||
AppendNumber(ref target, timeOfDay.Seconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static void AppendNumber(ref InplaceStringBuilder target, int number)
|
|
||||||
{
|
|
||||||
target.Append(GetAsciiChar(number / 10));
|
|
||||||
target.Append(GetAsciiChar(number % 10));
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
private static char GetAsciiChar(int value)
|
|
||||||
{
|
|
||||||
return (char)(AsciiNumberOffset + value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -589,7 +589,16 @@ namespace Microsoft.Net.Http.Headers
|
||||||
|
|
||||||
public static string FormatDate(DateTimeOffset dateTime, bool quoted)
|
public static string FormatDate(DateTimeOffset dateTime, bool quoted)
|
||||||
{
|
{
|
||||||
return dateTime.ToRfc1123String(quoted);
|
if (quoted)
|
||||||
|
{
|
||||||
|
return string.Create(31, dateTime, (span, dt) =>
|
||||||
|
{
|
||||||
|
span[0] = span[30] = '"';
|
||||||
|
dt.TryFormat(span.Slice(1), out _, "r");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return dateTime.ToString("r");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static StringSegment RemoveQuotes(StringSegment input)
|
public static StringSegment RemoveQuotes(StringSegment input)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue