DateTime. Век TryParse управляет C#

EE, здесь просто обнаруженный, что a>>-2 является немного удручающим.

я кивнул и сказал им, что это не было естественно.

20
задан Nat 19 November 2009 в 03:22
поделиться

3 ответа

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

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

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

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

21
ответ дан 30 November 2019 в 00:19
поделиться

Вы ищете свойство Calendar.TwoDigitYearMax .

Джон Скит опубликовал кое-что, что вы, вероятно, найдете полезным.

2
ответ дан 30 November 2019 в 00:19
поделиться

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

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...

11
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: