いくつかのデータベースからダンプされた DateTime 値である一連の文字列があります...おそらくMySql. 私は構造を制御できません。
文字列は次のようになります。
2011-05-17 00:00:00 その他/GMT
解析の前に「Etc/GMT」を置き換えることを含む解決策を見つけました。これは臭い。
タイムゾーン情報を取り除かずに、この文字列を DateTime に変換するワンステップの解決策はありますか?
指定された形式とカルチャ固有の形式情報を使用して、指定された日付と時刻の文字列表現を、対応する 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
ソースをざっと見てみると、野田時間のタイムゾーンデータベースに含ま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);
}