11

日付を RFC1123 形式で解析しようとしています (Thu, 21 Jan 2010 17:47:00 EST)。

これが私が試したものですが、どれもうまくいきませんでした:

DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
4

1 に答える 1

12

次のようなことを試しましたか:

string dateString, format;  
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;

dateString = "Thu, 21 Jan 2010 17:47:00 EST";
format = "ddd, dd MMM yyyy hh:mm:ss EST";

result = DateTime.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());

私はまだそれをテストしていません (すぐにテストします)... しかし、それでうまくいくと思います。

編集: 問題は、タイムゾーンは常に GMT である必要があると RFC1123 が述べていることのようです...これが、r または R がフォーマットとして機能しなかった理由です。問題はESTです。上記のパターンは EST を考慮していますが、これは静的であるため、他のタイムゾーンがある場合は問題が発生する可能性があります。最善の解決策は、RFC1123 標準を使用して GMT に移動することであり、問​​題を解決するはずです。できない場合は、解決策があるかもしれないことをお知らせください。

編集 2: これは完全な解決策ではありませんが、タイムゾーンを分離し、解析することができます。コードは、表示されているタイムゾーンを認識していませんが、任意のタイムゾーンの省略形をスローすることができ、時間を解析します。GMT に変換してから r または R を使用する場合は、正規表現の一致の結果を取得し、それをルックアップ テーブルと照合して (そのタイム ゾーンの略語に対してオフセットされた時刻を確認するため)、時刻を GMT に変換し、そこから解析します。それは良い解決策ですが、もう少し作業が必要です。コードは次のとおりです。

string dateString, format, pattern, tz;
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
pattern = @"[a-zA-Z]+, [0-9]+ [a-zA-Z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ (?<timezone>[a-zA-Z]+)";
dateString = "Thu, 21 Jan 2010 17:47:00 EST";

Regex findTz = new Regex(pattern, RegexOptions.Compiled);

tz = findTz.Match(dateString).Result("${timezone}");

format = "ddd, dd MMM yyyy HH:mm:ss " + tz;

try
{
    result = DateTime.ParseExact(dateString, format, provider);
    Console.WriteLine("Timezone format is: {0}", format);
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
    Console.WriteLine("{0} is not in the correct format.", dateString);
}

    Console.ReadLine();

これをタイムゾーンコンバーターに変換したい場合は、UTC オフセットのリストを次に示します。

UTC オフセットを含むタイムゾーンの略語

于 2010-04-05T19:21:32.653 に答える