2013-03-21 8 views
5

Ho un grande pezzo di testo come questo:l'analisi di questo tipo di stringa in DateTime - "Venerdì 22 Marzo 2013" (C#)

.... comunica di Venerdì 22 marzo 2013 ha il potenziale essere dichiarato un giorno .....

Devo individuare e quindi analizzare DateTime in esso (venerdì 22 marzo 2013). Posso individuarlo e usare DateTime.TryParse per ottenere quasi tutto, ma i suffissi ordinali (st, nd, rd, th) mi stanno buttando fuori.

Quando sto costruendo la stringa di formato prima di chiamare il metodo TryParse esistono caratteri jolly che è possibile utilizzare per tenere conto di tali suffissi? O qualche altro suggerimento?

Grazie!

+1

Hai provato la loro rimozione suffissi usando un string.replace o una regex? È un'opzione? –

risposta

2

Come sostituire i caratteri indesiderati utilizzando un regex?

Come esempio, la regex seguente dovrebbe eseguire il lavoro: "(?<=\d)[a-z]{2}".

codice di esempio

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)); 

uscita:

22/03/2013 00:00:00 

Questo dovrebbe prendersi cura della maggior parte dei casi, ma fare in modo di testare in modo corretto.

+1

E quando hai domenica, "nd" sarà sostituito con "" e poi kaboom! –

+0

@NikolaDavidovic Hai letto la mia risposta completa? Leggi l'ultima parte di nuovo. :) – eandersson

+0

La risposta che hai suggerito è sbagliata ma la generalizzazione successiva è buona. Perché non suggerisci la regex? –

1

Si potrebbe sempre Brute Force.

NOTA: Prenderò in prestito parte del codice di Fuji in modo da avere lo stesso aspetto e aspetto.

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); 

Non 100% Ho ottenuto il costruttore "nuovo DateTime" corretto. Al momento non ho il mio IDE in esecuzione.

0

C'è an overload of DateTime.Parse that allows multiple format strings - è possibile passare gli ordinali come stringhe letterali, come questo metodo di supporto (che utilizza l'impostazione internazionale filo di elaborare mese/onomastico ortografia):

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); 
} 
Problemi correlati