2

フォーマットを見て: "MMM d yyyy"

これは機能しています

var t="Mar 2013 7";
DateTime dt=DateTime.Parse(t);

だが

also this :"Mar 7 2013"
and  this :"7  Mar 2013"

仕事中

見つめている :

new DateTimeFormatInfo()
               .GetAllDateTimePatterns()
               .Select((i,n)=>n+"    "+i)
               .ToList()
               .ForEach(f=>Console.WriteLine(f));

これは、日付と時刻の値をフォーマットできるすべての標準パターンです。

結果は次のとおりです。

0    MM/dd/yyyy
1    yyyy-MM-dd
2    dddd, dd MMMM yyyy
3    dddd, dd MMMM yyyy HH:mm
4    dddd, dd MMMM yyyy hh:mm tt
5    dddd, dd MMMM yyyy H:mm
6    dddd, dd MMMM yyyy h:mm tt
7    dddd, dd MMMM yyyy HH:mm:ss
8    MM/dd/yyyy HH:mm
9    MM/dd/yyyy hh:mm tt
10    MM/dd/yyyy H:mm
11    MM/dd/yyyy h:mm tt
12    yyyy-MM-dd HH:mm
13    yyyy-MM-dd hh:mm tt
14    yyyy-MM-dd H:mm
15    yyyy-MM-dd h:mm tt
16    MM/dd/yyyy HH:mm:ss
17    yyyy-MM-dd HH:mm:ss
18    MMMM dd
19    MMMM dd
20    yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
21    yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
22    ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
23    ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
24    yyyy'-'MM'-'dd'T'HH':'mm':'ss
25    HH:mm
26    hh:mm tt
27    H:mm
28    h:mm tt
29    HH:mm:ss
30    yyyy'-'MM'-'dd HH':'mm':'ss'Z'
31    dddd, dd MMMM yyyy HH:mm:ss
32    yyyy MMMM
33    yyyy MMMM

質問 :

  • リストにMMM d yyyyフォーマットが表示されません。それで、それはどのようにそれをしますか?すべての組み合わせを試しますか?

  • フォーマットする時間を追加するのはどうMMM d yyyyですか?[Mar 3 2007 13:13:13]それも機能しますが、特定の形式はありません。それで、それはどのようにそれをしますか?

4

3 に答える 3

2

Reflector を使用してこれを確認しました。何百行もの解析コードがあり、非常に複雑です。

ただし、最終的には、入力文字列をトークン化し、トークンを曜日、月名、年、日番号などに分類しようとします。

特に、呼び出された関数internal TokenHashValue[] CreateTokenHashTable()には次のようなものがあります。

for (int i = 1; i <= 12; i++)
{
    this.InsertHash(dtfiTokenHash, this.GetAbbreviatedMonthName(i), TokenType.MonthToken, i);
}

これを使用して (ご覧のとおり、省略された月の名前がす​​べて含まれています)、トークンが月の名前であるかどうかを判断します。曜日名にも同様のコードがあります。

解析コードは、数字の 1 つが 2 桁を超えているかどうかもチェックします。その場合は、1 年と見なされます。これは、3 桁の年を使用でき、それでも問題なく解析できることを意味します (そして確認できます)。しかし、それはさらに複雑になります!また、数値が 12 より大きいかどうかもチェックし、12 より大きい場合は 1 年であると想定します。

それぞれが 12 以下の 2 つの数値を入力して機能しますが、最初の数値が 1 日、2 番目の数値が月であると想定されます (英国の文化の場合 - 他の文化の場合は異なると思います)。

もちろん、これにより、あいまいな日付を警告なしで解析できます。

結論は次のとおりです。決してこのような日付を解析しないでください

いつもParseExact()

于 2013-03-07T12:42:59.637 に答える
1

ここで DateTime.Parse ソース コードへのリンクを見つけました: http://typedescriptor.net/name/members/5B57671F27DBC0AEA0EB9825243834CF-System.DateTime.Parse(String,IFormatProvider,DateTimeStyles)

リンクをクリックして、プライベート メソッドをさらに掘り下げることができますが、複雑になります。しかし、コンパイラのように字句解析と解析を行うようです。文字列はパーツ (トークン) に分割され、それぞれが年なのか月なのかなどを識別しようとします。

確かにあいまいさがあるかもしれません。たとえば、dd-MM-yyyy を意味していたのに、MM-dd-yyyy として解析された可能性があります。しかし、カルチャ固有の IFormatProvider を指定できるのはそのためです。

于 2013-03-07T12:38:11.047 に答える
1

配置ではなく、フォーマット指定子を使用していると思います。

リテラルの「2013 年 3 月 7 日」の書き方からすると、その構文解析が曖昧であるとは思えません。

  • Mar は MMM と完全に一致します
  • 2003 は yyyy と完全に一致します
  • 7 正確に d に一致
于 2013-03-07T12:24:34.860 に答える