日時のリストをフォーマットしようとしています。1つの日付は私が提供したものと同じ形式ですが、要素は適切ではありません。そのコード行を以下に示します。誰かが以下の行のエラーをスキップする方法を教えてもらえますか?
Convert.ToDateTime("22-01-2013 00:00:00").ToString("yyyy-MM-dd");
そもそも使用は避けたいと思いConvert.ToDateTime
ます。DateTime.TryParse
または(できれば)を使用することをお勧めしDateTime.TryParseExact
ます。これらは両方とも、変換が成功したかどうかを示す値を返すため、不良データをスキップするために例外のキャッチを開始する必要はありません。例えば:
DateTime parsed;
if (DateTime.TryParse(text, out parsed))
{
string reformatted = parsed.ToString("yyyy-MM-dd");
// Use reformatted
}
else
{
// Log error, perhaps?
}
複数の可能な形式がある場合は、1回の呼び出しで複数の形式を指定できるオーバーロードの使用TryParseExact
を検討する必要があります。
形式だけでなく、使用するカルチャも考慮する必要があります。上記のコード(およびコード)では、実行中のスレッドのカルチャを使用します。それはいつもあなたが望むものですか?カルチャはあらゆる種類のものに影響を与える可能性があります。通常、カスタム形式を指定する場合は、不変のカルチャを使用する必要があります。そうしないと、たとえば、グレゴリオ暦以外のカレンダーを予期せず使用してしまう可能性があります...
編集:入力が常に次の形式dd-MM-yyyy
である場合は、おそらく次を使用する必要があります。
DateTime parsed;
if (DateTime.TryParseExact(text, "dd-MM-yyyy", CultureInfo.InvariantCulture,
DateTimeStyles.Default, out parsed))
{
string reformatted = parsed.ToString(CultureInfo.InvariantCulture,
"yyyy-MM-dd");
// Use reformatted
}
else
{
// Log error, perhaps?
}
Convert.ToDateTime
使用する代わりにDateTime.Parse
またはDateTime.ParseExact
ParseExact
フォーマットをより細かく制御できるので、次に例を示します。
DateTime.ParseExact("22-01-2013 00:00:00","dd-MM-yyyy HH:mm:ss",CultureInfo.InvariantCulture).ToString("yyyy-MM-dd");
TryParseExact
解析エラーを適切に処理できるようにするバリアントもあります。
DateTime.ParseExact()
の代わりにメソッドを使用してみてください。
日付と時刻の指定された文字列表現を同等のDateTimeに変換します。
public static void Main(string[] args)
{
Console.WriteLine(DateTime.ParseExact("22-01-2013 00:00:00", "dd-MM-yyyy HH:mm:ss", CultureInfo.CurrentCulture).ToString("yyyy-MM-dd"));
}
これがDEMO
です。
Coding Best Practices Using DateTime in the .NET Framework
また、すべての.NET開発者が読むべきだと思うものも確認してください。
試してみてください:
DateTime.ParseExact("22-01-2013 00:00:00","dd-MM-yyyy HH:mm:ss",CultureInfo.InvariantCulture).ToString("yyyy-MM-dd");
このようにして、日付文字列の正確な形式を指定できます。