Apricot.Fetcher.ParseRfc822 C# (CSharp) Method

ParseRfc822() private method

private ParseRfc822 ( string s ) : System.DateTime
s string
return System.DateTime
        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);
        }