C#でRFC822のTimeZone文字列表記をParseする

C#でメールの日付をParseしようとしてDate:ヘッダの値をそのままDateTimeOffset.Parse()に食わせたら例外で死んでしまいました。
「何で?」と思ったら、DateTimeOffset.Parse(DateTime.Parseも同様)は"GMT"以外のRFC822のTimeZone文字列表記には対応していないようです。
なので"Sat, 30 Aug 2014 12:34:50 JST"ですらNGという結果に。
確かにこのTimeZone文字列はRFC2822でObsoleteになっているとはいえ、今でも受信メールには普通にこの表記がある以上、Parse出来ずに死んでしまうというのはちょっと使い物にならないです。

で、こんな一般的な問題なのであれば当然誰かが既に対応済みだろうということでそれっぽいキーワードでググってみたのですが、残念ながら適切なものを見つけることが出来ませんでした(欧米でよく使うTimeZone文字列に限定して対応しているものはいくつか見つけたのですが)。
仕方がないので、

を参考に、こんな力技のメソッドを組む羽目に。アホすぎる作りなのは承知の上ですが「出来ないよりマシ」ということで。
それにしても何でこのTimeZone文字列がTimeZoneInfo.GetSystemTimeZonesで取れる情報に含まれてないんだろう…

using System.Text.RegularExpressions;

    public static DateTimeOffset Parse(string s)
    {
        s = Regex.Replace(s, "UTC$", "+0000", RegexOptions.Compiled);
        s = Regex.Replace(s, "ECT$", "+0100", RegexOptions.Compiled);
        s = Regex.Replace(s, "EET$", "+0200", RegexOptions.Compiled);
        s = Regex.Replace(s, "ART$", "+0200", RegexOptions.Compiled);
        s = Regex.Replace(s, "EAT$", "+0300", RegexOptions.Compiled);
        s = Regex.Replace(s, "MET$", "+0330", RegexOptions.Compiled);
        s = Regex.Replace(s, "NET$", "+0400", RegexOptions.Compiled);
        s = Regex.Replace(s, "PLT$", "+0500", RegexOptions.Compiled);
        s = Regex.Replace(s, "IST$", "+0530", RegexOptions.Compiled);
        s = Regex.Replace(s, "BST$", "+0600", RegexOptions.Compiled);
        s = Regex.Replace(s, "VST$", "+0700", RegexOptions.Compiled);
        s = Regex.Replace(s, "CTT$", "+0800", RegexOptions.Compiled);
        s = Regex.Replace(s, "JST$", "+0900", RegexOptions.Compiled);
        s = Regex.Replace(s, "ACT$", "+0930", RegexOptions.Compiled);
        s = Regex.Replace(s, "AET$", "+1000", RegexOptions.Compiled);
        s = Regex.Replace(s, "SST$", "+1100", RegexOptions.Compiled);
        s = Regex.Replace(s, "NST$", "+1200", RegexOptions.Compiled);
        s = Regex.Replace(s, "MIT$", "-1100", RegexOptions.Compiled);
        s = Regex.Replace(s, "HST$", "-1000", RegexOptions.Compiled);
        s = Regex.Replace(s, "AST$", "-0900", RegexOptions.Compiled);
        s = Regex.Replace(s, "PST$", "-0800", RegexOptions.Compiled);
        s = Regex.Replace(s, "PNT$", "-0700", RegexOptions.Compiled);
        s = Regex.Replace(s, "MST$", "-0700", RegexOptions.Compiled);
        s = Regex.Replace(s, "CST$", "-0600", RegexOptions.Compiled);
        s = Regex.Replace(s, "EST$", "-0500", RegexOptions.Compiled);
        s = Regex.Replace(s, "IET$", "-0500", RegexOptions.Compiled);
        s = Regex.Replace(s, "PRT$", "-0400", RegexOptions.Compiled);
        s = Regex.Replace(s, "CNT$", "-0330", RegexOptions.Compiled);
        s = Regex.Replace(s, "AGT$", "-0300", RegexOptions.Compiled);
        s = Regex.Replace(s, "BET$", "-0300", RegexOptions.Compiled);
        s = Regex.Replace(s, "CAT$", "-0100", RegexOptions.Compiled);
        return DateTimeOffset.Parse(s);
    }