4

いくつかのデータベースからダンプされた DateTime 値である一連の文字列があります...おそらくMySql. 私は構造を制御できません。

文字列は次のようになります。

2011-05-17 00:00:00 その他/GMT

解析の前​​に「Etc/GMT」を置き換えることを含む解決策を見つけました。これは臭い。

タイムゾーン情報を取り除かずに、この文字列を DateTime に変換するワンステップの解決策はありますか?

4

3 に答える 3

6

DateTime.ParseExact

指定された形式とカルチャ固有の形式情報を使用して、指定された日付と時刻の文字列表現を、対応する DateTime に変換します。文字列表現の形式は、指定された形式と正確に一致する必要があります。

ファンキーなフォーマットの場合は、ParseExact. また、おそらく使用したいでしょうDateTimeStyles.AssumeUniversal

String original = "2011-05-17 00:00:00 Etc/GMT";
DateTime result = DateTime.ParseExact(
    original,
    "yyyy-MM-dd HH:mm:ss 'Etc/GMT'",
    System.Globalization.CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal);
Console.WriteLine(result.ToString()); // given my timezone: 5/16/2011 8:00:00 PM
Console.WriteLine(result.ToUniversalTime().ToString()); // 5/17/2011 12:00:00 AM
于 2013-09-18T20:18:13.827 に答える
4

ソースをざっと見てみると、野田時間のタイムゾーンデータベースに含まEtc/GMTれているようです。

日付と時刻を解析する方法は、Noda Time と .Net Framework では少し異なります (私は決して Noda Time の専門家ではありません)。

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    @"yyyy'-'MM'-'dd HH':'mm':'ss z",
    DateTimeZoneProviders.Tzdb);

var result = pattern.Parse(@"2011-05-17 00:00:00 Etc/GMT");
if (result.Success)
{
    Console.WriteLine("{0}", result.Value);
}
于 2013-09-18T20:40:59.957 に答える