2015-12-31 5 views
7

Ich versuche, mit sehr alter Formatierung in einer Art von Datei zu lesen.Parsing 2 stellige Daten

Darin wird das Datumsformat im Format yymmdd angegeben, wobei ein zweistelliges Jahr im Bereich [00, 59] als im 21. Jahrhundert und ein Jahr im Bereich [60, 99 ] gilt als im 20. Jahrhundert, so dass 59 das Jahr 2059 und 60 das Jahr 1960 darstellt.

Wie würde ich gehen über das Parsen in DateTime in C#?

Ich habe zu tun versucht:

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

Aber die Standard-2-stelliger Jahres Regeln behandeln Werte im Bereich [00, 29] als 21. Jahrhunderts und Werte im Bereich [30, 99] als 20. Jahrhundert.

Gibt es eine Möglichkeit, dieses Verhalten zu ändern, um zu tun, was ich will, oder gibt es eine andere Technik, die ich verwenden könnte?

+1

eine Zeile nach 'TryParseExact' hinzufügen 100 Jahren zu subtrahieren, wenn es zwischen 2030 und 2059 ist? –

+0

Sie könnten die Zeichenfolge von einem 2-stelligen Jahres- in ein 4-stelliges Jahr ändern, indem Sie die von Ihnen festgelegten Regeln verwenden, bevor Sie sie an 'TryParseExact' übergeben –

+0

Sie können Ihre eigene' Calendar'-Klasse erstellen, indem Sie den Standard als Vorlage verwenden [Calendar.TwoDigitYearMax] (https://msdn.microsoft.com/en-us/library/system.globalization.calendar.twodigityearmax (v = vs.110) .aspx) Eigenschaft. –

Antwort

2

Sie verwenden, um zu analysieren können einen regulären Ausdruck verwenden, um Werte für das Datum zu analysieren und dann bauen sie Ihre eigene Logik mit:

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

Ich denke, dass es in diesem Fall einfacher wäre, einen regulären Ausdruck wie (\d{2})(\d{2})(\d{2}) zu verwenden, um Jahr, Monat und Tag zu extrahieren, dann Sie Ihre Geschäftslogik und erstellen Sie ein neues Datum Zeitobjekt von dort.

Wenn dies ein gemeinsames Verhalten in der Anwendung ist, möchten Sie vielleicht zu prüfen, es eine Erweiterungsmethode zu machen.

4

hängen Sie einfach das Jahrhundert Präfix der Zeichenfolge und dann die Formatzeichenfolge ändern kann die vierstellige Jahr

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

Sie Calendar.TwoDigitYearMax ändern und die geänderte Kultur für das Parsen

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

Oder reiniger 'str = str.Substring (0, 2)> = 60? "19" + str: "20" + str; ' –

+1

@ bto.rdz Ist das wirklich sauberer? Schwer zu sagen, was es auf den ersten Blick macht. – Cyral

+0

@ bto.rdz, Sie vergleichen String mit int. – dotctor