EE, здесь просто обнаруженный, что a>>-2 является немного удручающим.
я кивнул и сказал им, что это не было естественно.
Это сложно, потому что способ работы с двумя цифрами года с TryParse основан на свойстве TwoDigitYearMax свойства Calendar используемого вами объекта CultureInfo. (CultureInfo-> Calendar-> TwoDigitYearMax)
Чтобы добавить к двузначным годам 20, вам необходимо вручную создать объект CultureInfo, который имеет объект Calendar с 2099, установленным в качестве свойства TwoDigitYearMax. К сожалению, это означает, что к любой двухзначной дате будет добавлено 20 (включая 98, 99 и т. Д.), Что, вероятно, не то, что вам нужно.
Я подозреваю, что лучше всего использовать стороннюю библиотеку синтаксического анализа даты вместо стандартного tryparse, который будет использовать правило + 50 / -50 лет для 2-значных лет. (что двухзначный год должен быть переведен в диапазон от 50 лет до этого года и на 50 лет больше, чем этот год).
В качестве альтернативы вы можете переопределить метод ToFourDigitYear для объекта календаря (он виртуальный) и использовать его для реализовать правило -50 / + 50.
Вы ищете свойство Calendar.TwoDigitYearMax .
Джон Скит опубликовал кое-что, что вы, вероятно, найдете полезным.
Я бы написал многократно используемую функцию:
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...