10

使えなくて困っていますDateTime.Parse

私はさまざまな形式の日付を処理しており、そのうちのいくつかは形式January 11thなどFebruary 22ndです。

DateTime.Parseこれらの種類の日付を解析しようとすると、例外がスローされます。

設定できるフラグのように、Parse をより受け入れやすい方法で動作させる機能が DateTime に組み込まれているかどうか疑問に思っていました。

これは比較的単純な正規表現で解決できることを認識しています。さらに、私が書いた日付にあいまい一致するクラスがすでにありますが、この種の抽出を実行する組み込みの方法があるかどうかを知りたいです。車輪を再発明するよりも、長期的には維持する方が簡単です。

4

3 に答える 3

18

などの形式で日付を解析するために.Netフレームワークに組み込まれているものはありませんJanuary 11th or February 22nd。サフィックス文字を削除する必要があり、その後使用できます DateTime.TryParseExact

サフィックスstが ,の日付についてはth、 を使用string.Replaceしてその部分を削除してから を使用できますDateTime.TryParseExact。お気に入り。

string str = "1st February 2013";
DateTime dtObject;
string replacedStr =  str.Substring(0,4)
                         .Replace("nd","")
                         .Replace("th","")
                         .Replace("rd","")
                         .Replace("st","")
                         + str.Substring(4);


if (DateTime.TryParseExact(replacedStr, 
                            "dd MMMMM yyyy", 
                            CultureInfo.InstalledUICulture, 
                            DateTimeStyles.None, 
                            out dtObject))
{
 //valid date
}

複数の形式の場合、文字列配列で形式を指定し、後でそれを使用できます。bool解析が成功したかどうかを示す値を返します。

MSDN の例:

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"};
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
                        "5/1/2009 6:32:00", "05/01/2009 06:32", 
                        "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; 
DateTime dateValue;

foreach (string dateString in dateStrings)
{
   if (DateTime.TryParseExact(dateString, formats, 
                              new CultureInfo("en-US"), 
                              DateTimeStyles.None, 
                              out dateValue))
      Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
   else
      Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
于 2013-01-29T12:49:02.373 に答える
14

これは非常に古い質問ですが、複雑な自然言語の日付解析をまだ検討している人には、素晴らしい (Ruby ベースの) 慢性日付パーサーの .NET ポートである nChronic を使用することをお勧めします。

そのソースはここにあります: nChronic Github

Nuget にも Chronic として含まれています: Chronic in Nuget

このライブラリを使用した非常に単純なサンプル コードは次のようになります。

using Chronic;
var parser = new Chronic.Parser ();
Span ParseObj;
DateTime ParsedDateTime;
ParseObj = parser.Parse ("January 11th");
ParsedDateTime = ParseObj.Start;

処理できるものの例を次に示します。

単純

  • 木曜日
  • 11月
  • 金曜日
  • 13:00
  • 月 2:35
  • 午後4時
  • 10~8
  • 2時10分
  • 2時半
  • 朝6時
  • 金曜日午後1時
  • 夕方7時に座った
  • 昨日
  • 今日
  • 明日
  • 先週
  • 次の週
  • 今週の火曜日
  • 来月
  • 去年の冬
  • 今朝
  • 昨晩
  • この秒
  • 昨日の4時
  • 先週の金曜日 20:00
  • 先週の火曜日
  • 明日の午後6時45分
  • 午後
  • 昨日
  • 先週の木曜日

複雑

  • 3年前
  • 一年前
  • 今から5か月前
  • 7時間前
  • 今から7日後
  • 1週間後
  • 3時間で
  • 1年前の明日
  • 3 か月前の土曜日の午後 5 時
  • 明日の正午の7時間前
  • 11月第3水曜日
  • 来年3ヶ月目
  • 今年9月の第3木曜日
  • 先週の4日目
  • 2010 年 6 月 14 日夕方 11 時
  • 97 年 5 月 7 日午前 3 時

特定の日付

  • 1月5日
  • 6月22日
  • 2017 年 5 月 5 日
  • 2月21日
  • 12月25日
  • 5月27日
  • 2006 年 10 月
  • 10月06日
  • 2010 年 1 月 3 日
  • 2004 年 2 月 14 日
  • 2004 年 2 月 14 日
  • 2000 年 1 月 3 日
  • 1785年4月17日
  • 1979/5/27
  • 1979/5/27
  • 05/06
  • 1979-05-27
  • 金曜日
  • 5
  • 4:00
  • 17:00
  • 0800

特定の時間 (上記の多くに時間が追加されています)

  • 1月5日午後7時
  • 6月22日午前8時
  • 1979-05-27 05:00:00
  • 2012/03/01 07:25:09.234567

于 2014-08-31T02:16:17.570 に答える