91

次の日付を文字列形式で「2011-29-0112:00am」としています。今、私はそれを次のコードで日時形式に変換しようとしています:

DateTime.TryParse(dateTime, out dt); 

しかし、私は常にdtを{1/1/0001 12:00:00 AM}として取得しています。理由を教えていただけますか?その文字列を日付に変換するにはどうすればよいですか。

編集:私はちょうどフォーマット引数を使用するために言及されたすべての人を見ました。ここで、ユーザーが希望するカスタム日付形式を選択するための設定があり、そのユーザーがjQuery datepickerを介してその形式のテキストボックスで日付を自動的に取得できるため、形式パラメーターを使用できないことに言及します。

4

7 に答える 7

205

これは、例「2011-29-01 12:00 am」に基づいて機能するはずです

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);
于 2011-01-17T23:32:49.273 に答える
15

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 未満の場合はすべてヨーロッパ形式の日付がカバーされます。フォーマットされた日付。

于 2011-01-17T23:31:13.737 に答える
7

安全な TryParseExact メソッドを使用してみてください

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);
于 2012-04-27T16:05:48.927 に答える
4

msdn のDateTimeから:

型: System.DateTime% このメソッドが返されるときに、変換が成功した場合は s に含まれる日付と時刻に相当する DateTime 値を含み、変換が失敗した場合は MinValueを含みます。s パラメータが null の場合、空の文字列 ("") の場合、または日付と時刻の有効な文字列表現が含まれていない場合、変換は失敗します。このパラメーターは初期化されずに渡されます。

代わりに、フォーマット文字列で parseexact を使用してください"yyyy-dd-MM hh:mm tt"

于 2011-01-17T23:28:32.200 に答える
3

それはうまくいきます:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
于 2011-01-17T23:33:56.300 に答える
1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
于 2012-11-19T12:33:02.563 に答える
0

ユーザーに日付/時刻の形式を変更する機会を与える場合は、解析に使用する対応する形式の文字列を作成する必要があります。可能な日付形式がわかっている場合(つまり、ユーザーがリストから選択する必要がある場合)、コンパイル時にこれらの形式の文字列を作成できるため、これははるかに簡単です。

ユーザーに日付/時刻形式の自由形式の設計を許可する場合は、DateTime実行時に対応する形式の文字列を作成する必要があります。

于 2011-01-18T00:06:24.947 に答える