2015-12-31 2 views
7

Я пытаюсь читать в виде файла с очень старым форматированием.Анализ 2-значных дат

В нем формат даты указан в формате yymmdd, где 2-значный год в диапазоне [00, 59] считается находящимся в 21-м веке и годом в диапазоне [60, 99 ] считается в 20-м веке, так что 59 представляет год 2059 и 60 представляет 1960 год.

Как я могу разобрать это в DateTime на C#?

Я пробовал делать:

string str = ReadDateFromFile(); 
DateTime dt;  
DateTime.TryParseExact(str, "yyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 

Но правила года 2-значными по умолчанию рассматривать значения в диапазоне [00, 29] в 21-м века и значение в диапазоне [30, 99], а 20 века.

Есть ли способ изменить это поведение, чтобы делать то, что я хочу, или есть ли другой способ, который я мог бы использовать?

+1

Добавьте строку после 'TryParseExact', чтобы вычесть 100 лет, если она находится между 2030 и 2059 годами? –

+0

Вы можете изменить строку с двухзначного года на 4-значный год, используя все правила, которые вы решите, прежде чем передавать их на «TryParseExact». –

+0

. Подумайте о том, как построить свой собственный класс «Календарь», используя шаблон по умолчанию, и изменить [Calendar.TwoDigitYearMax] (свойство https://msdn.microsoft.com/en-us/library/system.globalization.calendar.twodigityearmax (v = vs.110) .aspx). –

ответ

2

You может использовать регулярное выражение для синтаксического анализа значений даты, а затем построить его с использованием пользовательской логики:

var regex = new Regex(@"(?<year>\d{2})(?<month>\d{2})(?<day>\d{2})"); 
var match = regex.Match(str); 
var year = int.Parse(match.Groups["year"].Value); 
// Same for day and month 
var date = new DateTime(
    year >= 60 ? 1900 + year : 2000 + year, 
    month, day); 
return date; 
3

Я думаю, что в этом случае было бы проще использовать регулярное выражение, такое как (\d{2})(\d{2})(\d{2}), чтобы извлечь год, месяц и день соответственно, затем вы делаете свою бизнес-логику и строите с ней новый объект времени.

Если это распространенное поведение в вашем приложении, вы можете подумать о том, чтобы сделать его методом расширения.

4

Просто добавьте префикс века в строку, а затем изменить формат строки для разбора четыре цифры года

string str = ReadDateFromFile(); 
if (int.Parse(str.Substring(0, 2) >= 60) 
    str = "19" + str; 
else 
    str = "20" + str; 

DateTime dt;  
DateTime.TryParseExact(str, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 

Вы можете изменить Calendar.TwoDigitYearMax и использовать модифицированную культуру для разбора

var myCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone(); 
myCulture.Calendar.TwoDigitYearMax = 2059; 
DateTime dt; 
DateTime.TryParseExact(str, "yyMMdd", myCulture, DateTimeStyles.None, out dt); 
+1

Или очиститель 'str = str.Substring (0, 2)> = 60? "19" + str: "20" + str; ' –

+1

@ bto.rdz Это действительно чище? Трудно сказать, что он делает с быстрым взглядом. – Cyral

+0

@ bto.rdz, Вы сравниваете строку с int. – dotctor

Смежные вопросы