2009-08-14 8 views
8

Я сделал общий синтаксический анализатор для обработки файлов ascii. Когда я хочу анализировать даты, я использую функцию ParseExact в объекте DateTime для синтаксического анализа, но у меня возникают проблемы с годом.Синтаксический анализ строки DateTime

Текст для разбора - это, например, «090812» с строкой parseExact «yyMMdd».

Я надеюсь получить объект DateTime, говорящий «12/8-2009», но я получаю «12/8-1909». Я знаю, что я мог бы сделать уродливое решение, проанализировав его впоследствии и тем самым изменив год.

Кто-нибудь знает, как это решить?

Заранее спасибо ..

Сорен

+0

Документы и другие сообщения предполагают, что это должно работать на дату, предоставленную вами (например, 2009 для 09). Можете ли вы опубликовать точный вызов ParseExact, который вы делаете? – Joe

+1

Дополнительная информация здесь: http://msdn.microsoft.com/en-us/library/system.globalization.gregoriancalendar.tofourdigityear.aspx – Joe

ответ

17

Теоретически элегантный способ сделать это: изменить TwoDigitYearMax свойство Calendar используемого DateTimeFormatInfo вы используете для синтаксического анализа текста. Например:

CultureInfo current = CultureInfo.CurrentCulture; 
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone(); 
// I'm not *sure* whether this is necessary 
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone(); 
dtfi.Calendar.TwoDigitYearMax = 1910; 

Затем используйте dtfi в вызове к DateTime.ParseExact.

Практический способ сделать это: добавить «20» к началу ввода и проанализировать с помощью «yyyyMMdd».

+0

Мне как-то нравится ваше теоретическое решение. «DateTimeFormatInfo» - это только одноразовая настройка. Это также допускает различные обрезания, а не просто предполагает, что все в этом веке. – Thorarin

+0

Выглядит хорошо .. Не совсем уверен, что вы пытаетесь сделать ..!? Но так или иначе, dtfi.Calendar.TwoDigitYearMax может быть установлен только на число выше 99 .. :-(.. И я не доволен решением, просто добавив «20» спереди, так как я не могу гарантировать это не смотря на более старые данные

+0

@MullerDK: Извините, он должен быть установлен в 2000 ... или, может быть, 1910, если вы хотите, чтобы 100812 был 1910 и т. д. –

2

Вам нужно будет определить, какое-то пороговая дату, подходящее для ваших данных. Если анализируемая дата предшествует этой дате, добавьте 100 лет. Безопасный способ сделать это - префикс входной строки с соответствующим веком. В этом примере я выбрал 1970 как обрезание:

string input = ...; 
DateTime myDate; 

if (Convert.ToInt32(input.Substring(0, 2)) < 70) 
    myDate = DateTime.ParseExact("20" + input, ...); 
else 
    myDate = DateTime.ParseExact("19" + input, ...); 

Джон Скит также опубликовал хороший пример использования DateTimeFormatInfo, что я на мгновение забыл о :)

2

Ну, если вы определенно, что все ваши Исходные даты - это столетие, тогда вы можете использовать parseExact для строки с исходным кодом «20».

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