2016-12-09 25 views
2

C#.NetでDateTime.TryParse APIを使用していました。下記のコードをご覧ください:日付要素区切り記号または区切り文字に関するDateTime.TryParse APIの内部動作

DateTime dt; 
//Behavior # 1 : forward slash date separator 
bool parsed = DateTime.TryParse("2016/12/01", out dt); //returns true. Date Value 01 December 2016 
//Behavior # 2 : dot date separator 
parsed = DateTime.TryParse("2016.12.02", out dt); //returns true. Date Value 02 December 2016 
//Behavior # 3 : dot date separator 
parsed = DateTime.TryParse("2016-12-03", out dt); //returns true. Date Value 03 December 2016 
//Behavior # 4 : comma date separator 
parsed = DateTime.TryParse("2016,12,04", out dt); //returns true. Date Value 04 December 2016 
//Behavior # 5 : space date separator 
parsed = DateTime.TryParse("2016 12 05", out dt); //returns true. Date Value 05 December 2016 

最初の3つの動作は私には問題ありません。私は既に/-が日付区切り文字として使用されていることを認識していました。今日、私は、ドイツ語の日付形式では日付の区切り文字として.を使用していることに気付きました。だから私は先に進み、APIが有効な日付区切り文字としてコンマ,と空白をどのように扱うことができるかについて調べようとしました。私は、コードを次のように書いた:文字以下

var allLanguageDateDelimiters = new List<string>(); 
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
{ 
    if(allLanguageDateDelimiters.All(x => x != ci.DateTimeFormat.DateSeparator)) 
    { 
     allLanguageDateDelimiters.Add(ci.DateTimeFormat.DateSeparator); 
     Console.WriteLine(ci.DateTimeFormat.DateSeparator); 
    } 
} 

このコードを印刷:

  1. /(スラッシュ)
  2. 。 (ピリオド)
  3. - (ハイフン)
  4. .(末尾のスペース文字とピリオド)

だから基本的に私は世界のすべての文化を反復し、すべての文字がための区切り文字または区切り文字として使用されているものを考え出しました日付フィールド。そして、DateTime.TryParse APIは、日付の区切り文字としてコンマ,とスペースを含む日付文字列を正常に解析すると、#4と5の動作をどのようにして表示できますか? DateTime.TryParse APIの内部実装について教えてもらえますか?私の前提は、それがそうでない文字列を解析している間だけ既存のすべての文化の区切り文字に従うべきだということです。

答えて

1

空白()の場合、これはすでにです。documentedです。

どれ大手、インナー、またはsに空白文字を末尾には無視されます。

です。

DateTime.TryParse("2016    12 05", out dt); 
DateTime.TryParse("   2016 12 05", out dt); 
DateTime.TryParse("2016 12 05  ", out dt); 

返信true

しかし、なぜカンマですか?これは、TokenType enumのSEP_Spaceメンバーが空白で区切られ、コンマが内部でと定義されているからだと思います。この列挙はメソッドを呼び出してTryParseLexメソッドを使用して文字列の現在の文字をトークン化していました。

// Separator tokens. 
.. 
.. 
SEP_Space  = 0x300, // Whitespace (including comma). 
+0

これは、培養物のいずれかの日付を表現しながら、それがセパレータとして使用されていない場合であってものみ解析するために、明示的に(カンマの場合)、このサポートが含まれている示唆しています。これは、CSVとTSVがファイルにデータを格納するために使用される有名なフォーマットであると考えられます。 – RBT

1

私は,(スペース)は、この種のフォーマットに意図的に使用されていると思います。

"Fri, 15 May 2009 20:10:57 GMT" 

これらの文字の繰り返しも無視されます。たとえば

"2016,, , ,12,, , 03" 

幸いに解析します。

関連する問題