private DateTime ParseRfc822(string s)
{
Match match = Regex.Match(s, @"(?<=\s)([+-][0-9]{4}|[A-Z]+)$", RegexOptions.CultureInvariant);
if (match.Success)
{
DateTime dt = Convert.ToDateTime(s.Substring(0, match.Index), CultureInfo.InvariantCulture);
if (s[match.Index] == '+')
{
dt = dt.AddHours(-Convert.ToInt32(s.Substring(match.Index + 1, 2), CultureInfo.InvariantCulture));
dt = dt.AddMinutes(-Convert.ToInt32(s.Substring(match.Index + 3, 2), CultureInfo.InvariantCulture));
}
else if (s[match.Index] == '-')
{
dt = dt.AddHours(Convert.ToInt32(s.Substring(match.Index + 1, 2), CultureInfo.InvariantCulture));
dt = dt.AddMinutes(Convert.ToInt32(s.Substring(match.Index + 3, 2), CultureInfo.InvariantCulture));
}
else
{
switch (match.Value)
{
case "A":
dt = dt.AddHours(1);
break;
case "B":
dt = dt.AddHours(2);
break;
case "C":
dt = dt.AddHours(3);
break;
case "D":
dt = dt.AddHours(4);
break;
case "E":
dt = dt.AddHours(5);
break;
case "F":
dt = dt.AddHours(6);
break;
case "G":
dt = dt.AddHours(7);
break;
case "H":
dt = dt.AddHours(8);
break;
case "I":
dt = dt.AddHours(9);
break;
case "K":
dt = dt.AddHours(10);
break;
case "L":
dt = dt.AddHours(11);
break;
case "M":
dt = dt.AddHours(12);
break;
case "N":
dt = dt.AddHours(-1);
break;
case "O":
dt = dt.AddHours(-2);
break;
case "P":
dt = dt.AddHours(-3);
break;
case "Q":
dt = dt.AddHours(-4);
break;
case "R":
dt = dt.AddHours(-5);
break;
case "S":
dt = dt.AddHours(-6);
break;
case "T":
dt = dt.AddHours(-7);
break;
case "U":
dt = dt.AddHours(-8);
break;
case "V":
dt = dt.AddHours(-9);
break;
case "W":
dt = dt.AddHours(-10);
break;
case "X":
dt = dt.AddHours(-11);
break;
case "Y":
dt = dt.AddHours(-12);
break;
case "Z":
case "UT":
case "GMT":
break;
case "EST":
dt = dt.AddHours(5);
break;
case "EDT":
dt = dt.AddHours(4);
break;
case "CST":
dt = dt.AddHours(6);
break;
case "CDT":
dt = dt.AddHours(5);
break;
case "MST":
dt = dt.AddHours(7);
break;
case "MDT":
dt = dt.AddHours(6);
break;
case "PST":
dt = dt.AddHours(8);
break;
case "PDT":
dt = dt.AddHours(7);
break;
default:
return dt;
}
}
return dt.Add(TimeZoneInfo.Local.GetUtcOffset(DateTime.Now));
}
return Convert.ToDateTime(s.Substring(0, s.Length), CultureInfo.InvariantCulture);
}