Подтвердить что ты не робот

DateTime.TryParse century control С#

Результат следующего фрагмента: "12/06/1930 12:00:00". Как я могу контролировать предполагаемый век, чтобы вместо этого "12 июня 30" стал 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());

Пожалуйста, отложите на данный момент тот факт, что правильное решение заключается в том, чтобы указать дату правильно в первую очередь.

Примечание. Результат не зависит от системного времени и времени для компьютера, запускающего код.

Ответ: Спасибо 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());
    }
4b9b3361

Ответ 1

Это сложно, потому что двухзначные годы работы с TryParse основаны на свойстве TwoDigitYearMax свойства Calendar объекта CultureInfo, который вы используете. (CultureInfo- > Календарь > TwoDigitYearMax)

Для того, чтобы сделать двухзначные годы с 20 добавочными, вам нужно вручную создать объект CultureInfo, у которого есть объект Calendar с 2099, установленным как свойство TwoDigitYearMax. К сожалению, это означает, что любая двузначная дата синтаксиса будет содержать 20 добавочных (включая 98, 99 и т.д.), Что, вероятно, не то, что вы хотите.

Я подозреваю, что ваш лучший вариант - использовать стороннюю парсинг-версию даты вместо стандартного tryparse, который будет использовать правило + 50/-50 год для двухзначных лет. (что двузначный год должен быть переведен в диапазон от 50 лет до этого года и на 50 лет больше, чем в этом году).

В качестве альтернативы вы можете переопределить метод ToFourDigitYear для объекта календаря (он виртуальный) и использовать его для реализации правила -50/+ 50.

Ответ 2

Я бы написал повторно используемую функцию:

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);
}

Обратите внимание, что теперь он обрабатывает 30 как 2030 вместо 1930...

Ответ 4

result = year.ToString().Length == 1 
      || year.ToString().Length == 2 ? "1" 
       : (Convert.ToInt32(year.ToString()
          .Substring(0, (year.ToString().Length - 2))) + 1).ToString();