2009-08-14 12 views
8

Utworzono ogólny analizator składni do analizowania plików ASCII. Kiedy chcę analizować daty, używam funkcji ParseExact w obiekcie DateTime do analizowania, ale mam problemy z rokiem.Przetwarzanie ciągu DateTime

Tekst do przeanalizowania to np. "090812" z ciągiem parseExact "yyMMdd".

Mam nadzieję uzyskać obiekt DateTime z napisem "12/8-2009", ale otrzymuję "12/8-1909". Wiem, że mogłem zrobić brzydkie rozwiązanie, parsując je później, a tym samym modyfikując rok.

Ktoś wie o sprytny sposób rozwiązania tego?

góry dzięki ..

Soren

+0

Dokumenty i inne posty sugerują, że powinno to zadziałać w podanym przez Ciebie dniu (np. 2009 na 09). Czy możesz opublikować dokładne wywołanie ParseExact, które tworzysz? – Joe

+1

Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/system.globalization.gregoriancalendar.tofourdigityear.aspx – Joe

Odpowiedz

17

Teoretycznie elegancki sposób: zmień wartość TwoDigitYearMax właściwości Calendar używanej przez DateTimeFormatInfo, której używasz do analizowania tekstu. Na przykład:

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; 

Następnie użyj dtfi w wywołaniu do DateTime.ParseExact.

Praktyczny sposób zrobienia tego: dodaj "20" na początku danych wejściowych i parsuj "yyyyMMdd".

+0

Podobają mi się twoje teoretyczne rozwiązania. "DateTimeFormatInfo" to tylko jednorazowa konfiguracja. Pozwala również na różne granice, a nie tylko zakładając, że wszystko jest w tym stuleciu. – Thorarin

+0

Wygląda ładnie .. Nie jestem całkiem pewien, co próbujesz zrobić ..!? Ale tak czy inaczej, dtfi.Calendar.TwoDigitYearMax może być ustawiony tylko na liczbę powyżej 99 .. :-(.. I nie jestem zadowolony z rozwiązania, po prostu dodając "20" z przodu, ponieważ nie mogę zagwarantować tego nie używa się do przeglądania starszych danych

+0

@MullerDK: Przepraszam, powinien być ustawiony na 2000 ... lub może 1910, jeśli chcesz, aby 100812 było 1910 itd. –

2

Musisz ustalić jakieś daty progowej odpowiedni dla Twoich danych. Jeśli przeanalizowana data jest przed tą datą, dodaj 100 lat. Bezpiecznym sposobem na to jest przedrostowanie łańcucha wejściowego odpowiednim wiekiem. W tym przykładzie wybrałem 1970 jako odcięcia:

string input = ...; 
DateTime myDate; 

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

Jon Skeet pisał też piękny przykład używając DateTimeFormatInfo że miałem chwilę zapomnieli o :)

2

dobrze, jeśli jesteś zdecydowany, że wszystkie daty źródłowe są w tym stuleciu, wtedy możesz użyć parseExact przeciwko "20" -poprawiony łańcuch źródłowy.