2

単一のフォーマット文字列を使用して、次のフォーマットで日付を読み取ろうとしています:

"1000.12.31"
"999.12.31"
"99.12.31"

これらは西暦 1000 年、西暦 999 年、西暦 99 年の日付に対応します。

次のフォーマット文字列を試しました:

yyyy.M.d. これは、999 年と 99 年では失敗します。

yy.M.d. これは 1000 と 999 では失敗します。また、99 を 1999 と解釈します。

私はそれを手動で解析することに頼ろうとしています(それはそれで十分簡単です)が、このようなことがDateTime.ParseExact、またはおそらく別の組み込みメソッドで可能であるかどうか興味がありますか?

4

3 に答える 3

2

最も簡単な方法は、既存の文字列を取得し、年の前にゼロをいくつか付けて、既存の DateTime.ParseExact を使用することだと思います。

どのように実装しても、手動で少し文字列をマッサージし、DateTime.ParseExact で手間のかかる作業を行うことにします。

static DateTime ParseExactYear(string input)
{
    switch (input.IndexOf('.'))
    {
        case 1: input = "000" + input; break;
        case 2: input = "00" + input; break;
        case 3: input = "0" + input; break;
    }

    return DateTime.ParseExact(input, "yyyy.M.d", null);
}

Debug.WriteLine(ParseExactYear("1000.12.31"));
Debug.WriteLine(ParseExactYear("999.12.31"));
Debug.WriteLine(ParseExactYear("99.12.31"));
Debug.WriteLine(ParseExactYear("9.12.31"));

Debug.WriteLine(ParseExactYear("1000.1.1"));
Debug.WriteLine(ParseExactYear("999.1.1"));
Debug.WriteLine(ParseExactYear("99.1.1"));
Debug.WriteLine(ParseExactYear("9.1.1"));

Output:
12/31/1000 12:00:00 AM
12/31/0999 12:00:00 AM
12/31/0099 12:00:00 AM
12/31/0009 12:00:00 AM
1/1/1000 12:00:00 AM
1/1/0999 12:00:00 AM
1/1/0099 12:00:00 AM
1/1/0009 12:00:00 AM
于 2012-06-28T17:26:08.287 に答える
2

現在の文化のDateTimeFormatInfo価値観から、99 を 1999 と解釈します。解析動作を変更したい場合は、以下を変更する必要がありますDateTimeFormatInfo:

string eg = "9.1.2";
DateTime dt;

var fi = new System.Globalization.DateTimeFormatInfo();
fi.Calendar = (System.Globalization.Calendar)fi.Calendar.Clone();
fi.Calendar.TwoDigitYearMax = 99;
fi.ShortDatePattern = "y.M.d";
bool b = DateTime.TryParse(eg, fi, System.Globalization.DateTimeStyles.None, out dt);

の新しいインスタンスは同じオブジェクトをDateTimeFormatInfo共有します。特定のインスタンスをカスタマイズする場合Calendarは、これを行う必要があります。Clone

于 2012-06-28T19:25:07.637 に答える
2

これは手動で解析するのは簡単です。で動作するように適応させようとする努力に値するとは思いませんDateTime.ParseExact

string str = "99.12.31";
int[] parts = str.Split('.').Select(int.Parse).ToArray();
DateTime date = new DateTime(parts[0], parts[1], parts[2]);
于 2012-06-28T18:39:10.693 に答える