public static string ToString(DateTime dt, TimeSpan?utc_offset, string format, DateTimeFormatInfo dfi)
{
StringBuilder stringBuilder = new StringBuilder(format.Length + 10);
DateTimeFormatInfo invariantInfo = DateTimeFormatInfo.InvariantInfo;
if (format == invariantInfo.RFC1123Pattern)
{
dfi = invariantInfo;
}
else if (format == invariantInfo.UniversalSortableDateTimePattern)
{
dfi = invariantInfo;
}
int i = 0;
while (i < format.Length)
{
bool flag = false;
char c = format[i];
char c2 = c;
int num;
switch (c2)
{
case 'd':
num = DateTimeUtils.CountRepeat(format, i, c);
if (num <= 2)
{
DateTimeUtils.ZeroPad(stringBuilder, dfi.Calendar.GetDayOfMonth(dt), (num != 1) ? 2 : 1);
}
else if (num == 3)
{
stringBuilder.Append(dfi.GetAbbreviatedDayName(dfi.Calendar.GetDayOfWeek(dt)));
}
else
{
stringBuilder.Append(dfi.GetDayName(dfi.Calendar.GetDayOfWeek(dt)));
}
break;
default:
switch (c2)
{
case 'F':
flag = true;
goto IL_1E3;
default:
switch (c2)
{
case 's':
num = DateTimeUtils.CountRepeat(format, i, c);
DateTimeUtils.ZeroPad(stringBuilder, dt.Second, (num != 1) ? 2 : 1);
break;
case 't':
{
num = DateTimeUtils.CountRepeat(format, i, c);
string text = (dt.Hour >= 12) ? dfi.PMDesignator : dfi.AMDesignator;
if (num == 1)
{
if (text.Length >= 1)
{
stringBuilder.Append(text[0]);
}
}
else
{
stringBuilder.Append(text);
}
break;
}
default:
switch (c2)
{
case '"':
case '\'':
num = DateTimeUtils.ParseQuotedString(format, i, stringBuilder);
break;
default:
if (c2 != '/')
{
if (c2 != ':')
{
if (c2 != '\\')
{
stringBuilder.Append(c);
num = 1;
}
else
{
if (i >= format.Length - 1)
{
throw new FormatException("\\ at end of date time string");
}
stringBuilder.Append(format[i + 1]);
num = 2;
}
}
else
{
stringBuilder.Append(dfi.TimeSeparator);
num = 1;
}
}
else
{
stringBuilder.Append(dfi.DateSeparator);
num = 1;
}
break;
case '%':
if (i >= format.Length - 1)
{
throw new FormatException("% at end of date time string");
}
if (format[i + 1] == '%')
{
throw new FormatException("%% in date string");
}
num = 1;
break;
}
break;
case 'y':
num = DateTimeUtils.CountRepeat(format, i, c);
if (num <= 2)
{
DateTimeUtils.ZeroPad(stringBuilder, dfi.Calendar.GetYear(dt) % 100, num);
}
else
{
DateTimeUtils.ZeroPad(stringBuilder, dfi.Calendar.GetYear(dt), num);
}
break;
case 'z':
{
num = DateTimeUtils.CountRepeat(format, i, c);
TimeSpan timeSpan = (utc_offset == null) ? TimeZone.CurrentTimeZone.GetUtcOffset(dt) : utc_offset.Value;
if (timeSpan.Ticks >= 0L)
{
stringBuilder.Append('+');
}
else
{
stringBuilder.Append('-');
}
int num2 = num;
if (num2 != 1)
{
if (num2 != 2)
{
stringBuilder.Append(Math.Abs(timeSpan.Hours).ToString("00"));
stringBuilder.Append(':');
stringBuilder.Append(Math.Abs(timeSpan.Minutes).ToString("00"));
}
else
{
stringBuilder.Append(Math.Abs(timeSpan.Hours).ToString("00"));
}
}
else
{
stringBuilder.Append(Math.Abs(timeSpan.Hours));
}
break;
}
}
break;
case 'H':
num = DateTimeUtils.CountRepeat(format, i, c);
DateTimeUtils.ZeroPad(stringBuilder, dt.Hour, (num != 1) ? 2 : 1);
break;
case 'K':
num = 1;
if (utc_offset != null || dt.Kind == DateTimeKind.Local)
{
TimeSpan timeSpan = (utc_offset == null) ? TimeZone.CurrentTimeZone.GetUtcOffset(dt) : utc_offset.Value;
if (timeSpan.Ticks >= 0L)
{
stringBuilder.Append('+');
}
else
{
stringBuilder.Append('-');
}
stringBuilder.Append(Math.Abs(timeSpan.Hours).ToString("00"));
stringBuilder.Append(':');
stringBuilder.Append(Math.Abs(timeSpan.Minutes).ToString("00"));
}
else if (dt.Kind == DateTimeKind.Utc)
{
stringBuilder.Append('Z');
}
break;
case 'M':
{
num = DateTimeUtils.CountRepeat(format, i, c);
int month = dfi.Calendar.GetMonth(dt);
if (num <= 2)
{
DateTimeUtils.ZeroPad(stringBuilder, month, num);
}
else if (num == 3)
{
stringBuilder.Append(dfi.GetAbbreviatedMonthName(month));
}
else
{
stringBuilder.Append(dfi.GetMonthName(month));
}
break;
}
}
break;
case 'f':
goto IL_1E3;
case 'g':
num = DateTimeUtils.CountRepeat(format, i, c);
stringBuilder.Append(dfi.GetEraName(dfi.Calendar.GetEra(dt)));
break;
case 'h':
{
num = DateTimeUtils.CountRepeat(format, i, c);
int num3 = dt.Hour % 12;
if (num3 == 0)
{
num3 = 12;
}
DateTimeUtils.ZeroPad(stringBuilder, num3, (num != 1) ? 2 : 1);
break;
}
case 'm':
num = DateTimeUtils.CountRepeat(format, i, c);
DateTimeUtils.ZeroPad(stringBuilder, dt.Minute, (num != 1) ? 2 : 1);
break;
}
IL_6C6:
i += num;
continue;
IL_1E3:
num = DateTimeUtils.CountRepeat(format, i, c);
if (num > 7)
{
throw new FormatException("Invalid Format String");
}
int num4 = (int)(dt.Ticks % 10000000L / (long)Math.Pow(10.0, (double)(7 - num)));
int length = stringBuilder.Length;
DateTimeUtils.ZeroPad(stringBuilder, num4, num);
if (flag)
{
while (stringBuilder.Length > length && stringBuilder[stringBuilder.Length - 1] == '0')
{
stringBuilder.Length--;
}
if (num4 == 0 && length > 0 && stringBuilder[length - 1] == '.')
{
stringBuilder.Length--;
}
}
goto IL_6C6;
}
return(stringBuilder.ToString());
}