2013-03-21 29 views
5

Mam duży fragment tekstu tak:analizowania tego rodzaju sznurka do DateTime - „piątek 22 marca 2013” ​​(C#)

.... przypomina, że ​​piątek 22 marca 2013 ma potencjał być zadeklarowanym na dzień .....

Muszę zlokalizować, a następnie przeanalizować DateTime w nim (piątek, 22 marca 2013 r.). Mogę go zlokalizować i użyć DateTime.TryParse, aby uzyskać prawie wszystko, ale sufiksy porządkowe (st, nd, rd, th) mnie wyrzucają.

Kiedy konstruuję ciąg formatu przed wywołaniem metody TryParse, czy są jakieś znaki wieloznaczne, których mogę użyć do uwzględnienia tych sufiksów? Lub jakieś inne sugestie?

Dzięki!

+1

Czy próbowali ich usunięcie przyrostków używając string.replace lub regex? Czy to jest opcja? –

Odpowiedz

2

Co powiesz na zastąpienie niepożądanych znaków za pomocą numeru regex?

Jako przykład następujące polecenie powinno wykonać zadanie: "(?<=\d)[a-z]{2}".

Przykład kodu

string date = "Friday 22nd March 2013"; 
var r = new Regex(@"(?<=\d)[a-z]{2}"); 
String result = r.Replace(date, ""); 
Console.WriteLine(DateTime.Parse(result, CultureInfo.InvariantCulture)); 

wyjściowa:

22/03/2013 00:00:00 

Powinno to zająć większości przypadków, ale upewnij się, aby przetestować go prawidłowo.

+1

A kiedy masz niedzielę, "nd" zostanie zastąpione przez "", a następnie kaboom! –

+0

@NikolaDavidovic Czy przeczytałeś moją pełną odpowiedź? Przeczytaj ostatnią część ponownie. :) – eandersson

+0

Odpowiedź, którą zasugerowałeś, jest błędna, ale późniejsza generalizacja jest dobra. Dlaczego nie sugerujesz wyrażeń regularnych? –

1

Zawsze możesz zmusić Brute Wymuś to.

UWAGA: Pożyczę trochę kodu Fuji, więc mamy taki sam wygląd i styl.

string date = "Friday 22nd March 2013"; 
string[] split = date.Split(' '); 
string dayOfWeek = split[0]; // throw away & don't need 
int day = Convert.ToInt32(split[1].SubString(0, split[1].Length - 2); 
int month = 0; 
switch (split[2]) { 
    case "January": month = 1; break; 
    case "February": month = 2; break; 
    case "March": month = 3; break; 
    case "April": month = 4; break; 
    case "May": month = 5; break; 
    case "June": month = 6; break; 
    case "July": month = 7; break; 
    case "August": month = 8; break; 
    case "September": month = 9; break; 
    case "October": month = 10; break; 
    case "November": month = 11; break; 
    case "December": month = 12; break; 
} 
int year = Convert.ToInt32(split[3]); 
var dateTime = new DateTime(year, month, day); 
Console.WriteLine(dateTime); 

Nie 100% Poprawiono konstruktor "new DateTime". Nie mam teraz uruchomionego IDE.

0

Jest an overload of DateTime.Parse that allows multiple format strings - można przechodzić w porządkowych jak dosłowne ciągi, jak tej metody pomocnika (który używa locale wątek wypracować miesiąc/nazwa dnia pisownię):

private static DateTime ParseOrdinalDateTime(string dt) 
{ 
    string[] expectedFormats = new[] { 
             "dddd d'st' MMMM yyyy", 
             "dddd d'nd' MMMM yyyy", 
             "dddd d'rd' MMMM yyyy", 
             "dddd d'th' MMMM yyyy" 
             }; 

    return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None); 
}