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());
}
Ответы
Ответ 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...
Ответ 3
Вы ищете Calendar.TwoDigitYearMax Свойство.
Джон Скит опубликовал что-то на этом, вы, вероятно, найдете полезным.
Ответ 4
result = year.ToString().Length == 1
|| year.ToString().Length == 2 ? "1"
: (Convert.ToInt32(year.ToString()
.Substring(0, (year.ToString().Length - 2))) + 1).ToString();