web-dev-qa-db-ja.com

yyyy-dd-MM形式の日付に関するDateTime.TryParseの問題

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

DateTime.TryParse(dateTime, out dt); 

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

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

69
Rocky Singh

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

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);
163
BrokenGlass

ParseExact method を使用する必要があります。これは、日付時刻の形式を指定する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で形式を指定できる場合、それをこのメソッドに渡すことができる文字列に変換する必要があります。これは、ユーザーがフォーマット文字列を直接入力できるようにすることで可能です-これは、 will が無効なフォーマット文字列を入力するため、変換が失敗する可能性が高いことを意味します可能な選択肢を提示するコンボボックスで、これらの選択肢にフォーマット文字列を設定します。

入力が間違っている可能性が高い場合(たとえば、ユーザー入力)、エラーを処理するために例外を使用するよりも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);
}

より良い代替策は、notに日付形式の選択肢をユーザーに提示することですが、形式の配列を取る オーバーロードを使用することです

// 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);
}                                               

構成ファイルまたはデータベースから可能な形式を読み取る場合、人々が日付を入力するさまざまな方法に遭遇するときに、これらに追加できます。

12
ChrisF

安全な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);
4
KateA

Msdnの DateTime から:

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

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

4
RedDeckWins

それは動作します:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
3
Lucas S.
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
1
Hridayeshwar

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

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

0
Jim Mischel