ParseExact
メソッドを使用する必要があります。これは、日時の形式を指定する 2 番目の引数として文字列を取ります。次に例を示します。
// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
result = DateTime.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
ユーザーが UI で形式を指定できる場合は、それをこのメソッドに渡すことができる文字列に変換する必要があります。これを行うには、ユーザーが書式文字列を直接入力できるようにするか (これは、無効な書式文字列を入力するため、変換が失敗する可能性が高くなります)、可能な選択肢を提示するコンボ ボックスを用意することで実現できます。これらの選択肢の書式文字列を設定します。
入力が正しくない可能性が高い場合 (ユーザー入力など)、TryParseExact
例外を使用してエラー ケースを処理するよりも、次のように使用することをお勧めします。
// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
より良い代替手段は、ユーザーに日付形式の選択を提示せず、 format の配列を取るオーバーロードを使用することです。
// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
"MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into
try
{
dateValue = DateTime.ParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None);
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
構成ファイルまたはデータベースから可能な形式を読み取った場合、人々が日付を入力したいさまざまな方法に遭遇したときに、これらに追加できます。
このアプローチの主な欠点は、あいまいな日付が残ることです。形式は順番に試行されるため、ユーザーがアメリカ語を入力していると思っていたとしても、ヨーロッパ形式の日付がアメリカ語の前に試行され (またはその逆)、日が 13 未満の場合はすべてヨーロッパ形式の日付がカバーされます。フォーマットされた日付。