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


82

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

DateTime.TryParse(dateTime, out dt); 

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

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


4
ちなみに、の戻り値を確認することで、変換が失敗したかどうかを判断できますTryParse。それはbool success = DateTime.TryParse(...);です。
ジムミッシェル2011年

回答:


184

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

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

8
私を殴ってください。入力文字列の形式がわかっている場合は、事実上常にTryParseExact / ParseExactメソッドを使用する必要があります。
ユーロミセリ2011年

さて、私の日付形式は例の形式と似ていますが、日または月の値が1桁の場合、DateTimeパーサーは1桁しかないときに2桁を検索するため、エラーを返します。このシナリオで何を提案しますか?
Ciaran Gallagher

11
私自身の質問に答えるために、この場合、フォーマットで1文字を使用すると、1文字と2文字の両方の日付で機能します。たとえば、d / m / yyyyは2012
Ciaran Gallagher

@BrokenGlassこれは私のために機能していませんこれで私を助けてくれませんか
Meena

2
@CiaranGallagherちょっとしたコメントですが、コメントの日付には大きなM(d / M / yyyy)を使用する必要があります
Yusril Maulidan Raji 2017

14

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

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

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

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


5

安全な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

msdnのDateTimeから:

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

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


3

それはうまくいきます:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

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

0

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

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


そうですjimユーザーに日付/時刻形式の自由形式の設計を行わせる場合は、実行時に対応するDateTime形式の文字列を作成する必要があります。
ピナル2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.