14

検索構文の一部として自由形式の日付を使用しています。文字列から日付を解析する必要がありますが、実際に指定されている日付の部分のみを保持します。たとえば、「2010年11月1日」は特定の日付ですが、「2010年11月」は「2010年11月1日」から「2010年11月30日」までの日付の範囲です。

残念ながら、DateTime.Parse友人はこれらの日付を同じように解析しますDateTime

DateTime.Parse("November 1, 2010") // == {11/1/2010 12:00:00 AM}
DateTime.Parse("November, 2010") // == {11/1/2010 12:00:00 AM}

DateTimeのどの部分が実際に解析され、どの部分がパーサーによって推測されたかを知る必要があります。基本的に、私は必要DateTime.Parse("November, 2010") == {11/-1/2010 -1:-1:-1}です; 次に、日の部分が欠落していることを確認し、月全体をカバーする日付の範囲を計算できます。

(内部的には、C#には日付を解析して必要な情報を正確に保持するクラスDateTimeParseDateTimeResultクラスがありますが、日付がパブリックインターフェイスに戻るまでに、削除されています。実際にそうでない限り、これらのクラスに反映することは避けたいと思います。唯一のルートです。)

DateTime.Parse日付の解析に使用した形式を教えてもらう方法はありますか?または、返品DateTimeされた部品に不特定の部品のプレースホルダーを含めることはできますか?別の日付パーサーを使用することもできますが、内部のものと同じくらい信頼性が高く、ロケールに柔軟に対応できるようにしたいと思います。前もって感謝します。

編集:私も試しましたが、処理できるParseExactすべての形式を列挙するParseことはほぼ不可能のようです。Parse実際には、によって返されるよりも多くのフォーマットを受け入れますDateTimeFormatInfo.GetAllDateTimePatterns。これは、私が見つけることができるのとほぼ同じくらい標準的なソースです。

4

4 に答える 4

2

データ文字列が指定された正確な形式でない場合は失敗します。さまざまな組み合わせを試してみてください。1 つが成功すると、日付の形式がわかります。したがって、そこになく、パーサーがデフォルトで入力した日付の部分がわかります。欠点は、ユーザーが日付を入力する方法を予測する必要があるため、正確にそれを期待できることです。

正規表現を使用して、日付文字列を自分で消化することもできます。繰り返しますが、異なる正規表現 (または非常に複雑な単一の正規表現) が必要になりますが、この方法でも文字列を引き離すことは確かに可能です。そうすれば、自分が実際に何を持っているかがわかります。

于 2011-03-01T17:11:27.800 に答える
0

日と年の存在を確認するために、元の文字列に戻るこのメソッドを使用しました。

  • daysの場合、日が指定されている場合、元の文字列には整数として 1 が含まれている必要があります。そのため、文字列を分割して 1 を探します。唯一の例外は月が 1 月 (#1 月) の場合に発生するため、1 が 2 つあるか、元の文字列に 1 と "January" または "Jan" があるかどうかを確認する必要があります。
  • yearsの場合、元の文字列には年を表す数値が含まれている必要があります (たとえば、1900 年から 2100 年まで)。他の可能性としては、アポストロフィや のようなものが使用される可能性があります02-10-16。これは、正確に 3 つの数字があるという事実によって認識できます。

これがかなりヒューリスティックであることはわかっていますが、ほとんどの場合に機能する高速でシンプルなソリューションです。このアルゴリズムは、 sharp-datefinderライブラリのメソッドDateFinder.DayExists()DateFinder.YearExists()メソッドでC# でコーディングしました。

于 2016-09-14T21:01:51.490 に答える
0

基本的に、DateTime.Parse("November, 2010") == {11/-1/2010 -1:-1:-1}; が必要です。次に、日の部分が欠落していることを確認し、月全体をカバーする日付の範囲を計算できます。

負の時間/秒/分/日の値を持つことはできないため、必要なのは不正な DateTime です。正当な DateTime 以外のものを返したい場合は、DateTime を返さない独自のメソッドを作成する必要があります。

DateTime.Parse を取得して、日付の解析に使用した形式を教えてくれる方法はありますか? または、返された DateTime に、指定されていない部分のプレースホルダーを含めることができますか? 私は別の日付パーサーを使用することにもオープンですが、内部のものと同じくらい信頼性が高く、ロケールに柔軟であってほしいと思っています。

ここを見てください http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx

このタスクを実行するには、入力内容を手動で追跡する必要があります。唯一の解決策は、入力が正しい形式であることを確認することです。

于 2011-03-01T17:11:51.320 に答える