21

次のスニペットの結果は「12/06/193012:00:00」です。「12Jun30」が代わりに2030になるように、暗黙の世紀をどのように制御しますか?

    string dateString = "12 Jun 30"; //from user input
    DateTime result;
    DateTime.TryParse(dateString, new System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,out result);
    Console.WriteLine(result.ToString());

とりあえず、正しい解決策は最初に日付を正しく指定することであるという事実を脇に置いておいてください。

注:結果は、コードを実行しているPCのシステム日時とは無関係です。

回答:Deeksyに感謝します

    for (int i = 0; i <= 9; i++)
    {
        string dateString = "12 Jun " + ((int)i * 10).ToString();
        Console.WriteLine("Parsing " + dateString);
        DateTime result;
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-GB");
        cultureInfo.Calendar.TwoDigitYearMax = 2099;
        DateTime.TryParse(dateString, cultureInfo , System.Globalization.DateTimeStyles.None, out result);
        Console.WriteLine(result.ToString());
    }
4

5 に答える 5

24

TryParseで2桁の年が機能する方法は、使用しているCultureInfoオブジェクトのCalendarプロパティのTwoDigitYearMaxプロパティに基づいているため、注意が必要です。(CultureInfo-> Calendar-> TwoDigitYearMax)

2桁の年に20を付加するには、TwoDigitYearMaxプロパティとして2099が設定されたCalendarオブジェクトを持つCultureInfoオブジェクトを手動で作成する必要があります。残念ながら、これは、解析された2桁の日付に20が付加されることを意味します(98、99などを含む)。これはおそらくあなたが望むものではありません。

2桁の年に+50/ -50年のルールを使用する標準のtryparseの代わりに、サードパーティの日付解析ライブラリを使用するのが最善の選択肢だと思います。(2桁の年は、今年の50年前から今年より50年大きい範囲に変換する必要があります)。

または、カレンダーオブジェクト(仮想)のToFourDigitYearメソッドをオーバーライドし、それを使用して-50 /+50ルールを実装することもできます。

于 2009-11-19T03:08:49.757 に答える
12

再利用可能な関数を作成します。

public static object ConvertCustomDate(string input)
{
    //Create a new culture based on our current one but override the two
    //digit year max.
    CultureInfo ci = new CultureInfo(CultureInfo.CurrentCulture.LCID);
    ci.Calendar.TwoDigitYearMax = 2099;
    //Parse the date using our custom culture.
    DateTime dt = DateTime.ParseExact(input, "MMM-yy", ci);
    return new { Month=dt.ToString("MMMM"), Year=dt.ToString("yyyy") };
}

これが準日付文字列のリストです

List<string> dates = new List<string>(new []{
    "May-10",
    "Jun-30",
    "Jul-10",
    "Apr-08",
    "Mar-07"
});

次のようにスキャンします。

foreach(object obj in dates.Select(d => ConvertCustomDate(d)))
{
    Console.WriteLine(obj);
}

現在、1930ではなく2030として30を処理していることに注意してください...

于 2010-08-18T17:32:11.563 に答える
3

Calendar.TwoDigitYearMaxプロパティを探しています。

Jon Skeetがこれについて何かを投稿しましたが、おそらく役に立つでしょう。

于 2009-11-19T03:24:58.290 に答える
1

同様の問題が発生し、正規表現で解決しました。あなたの場合、それは次のようになります:

private static readonly Regex DateRegex = new Regex(
@"^[0-9][0-9] (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9][0-9]$",
RegexOptions.Compiled | RegexOptions.ExplicitCapture);

private static string Beautify(string date)
{
    var match = DateRegex.Match(date);
    if (match.Success)
    {
        // Maybe further checks for correct day
        return date.Insert("dd-MMM-".Length, "20");
    }

    return date;
}
于 2018-02-11T18:25:12.153 に答える
-1
result = year.ToString().Length == 1 
      || year.ToString().Length == 2 ? "1" 
       : (Convert.ToInt32(year.ToString()
          .Substring(0, (year.ToString().Length - 2))) + 1).ToString();
于 2015-02-11T10:19:34.067 に答える