Laden...

elegantes auslesen des Datums aus einem String

Erstellt von mrdjoker vor 14 Jahren Letzter Beitrag vor 14 Jahren 5.921 Views
M
mrdjoker Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren
elegantes auslesen des Datums aus einem String

Hallo liebe myCharp Community,

wie kann ich am geschicktesten das Datum aus einem String auslesen?
der String ist immer wie folgt aufgebaut:
Berlin 10-10-2008 Bild1
Berlin 10-10-2008 Bild2
London 01-05-2007 Bild1

Da das Datum immer an der gleichen Stelle ist, könnte ich natürlich die Zahlen in Integer konvertieren
und anschließend mit new DateTime(jahr,monat, tag) das Datum zurückgeben.

Was mir an dieser Lösung nicht gefällt ist, dass sich der Quellcode aufbläht, da ich gegebenenfalls auch auf Berlin "10-10-2008 Bild200" reagieren muss.

Habt ihr eine bessere Lösung für mich?
Gruß
mrdjoker

946 Beiträge seit 2008
vor 14 Jahren

Imho müsste folgendes funktionieren:

string s = "London 01-05-2008 Bild200";
int start = s.IndexOf(' ') + 1, end = s.IndexOf(' ', start);
DateTime dateTime = DateTime.Parse(s.Substring(start, end - start));

Vorausgesetzt allerdings, dass der String wirklich immer so aufgebaut ist.
Ansonsten könntest du dich auch mit RegEx bemühen.

mfg
SeeQuark

M
mrdjoker Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren
DateTime dateTime = DateTime.Parse(s.Substring(start, end - start));  

Genau so eine Zeile habe ich gesucht, Danke!

Ehrlich gesagt sind mir RegEx zu kompliziert.
Ich benutze die nur, wenn ich Links aus einer Webseite haben möchte und dass auch nur, weil es in Nützliche Regex-Pattern bereits fertige Lösungen gibt.

J
3.331 Beiträge seit 2006
vor 14 Jahren

Wenn du dich auf die Positionen und Anzahl der Leerzeichen verlassen kannst, kannst du auch **String.Split **verwenden und auf das zweite Element des String-Arrays zugreifen:

string [] split = s.Split(new Char [] {' '});
DateTime date = DateTime.Parse( split[1] );

Aber auch da reicht das vermutlich genausowenig wie bei SeeQuarks Lösung. In beiden Fällen solltest du eine Parse-Variante - noch sicherer **TryParse **- mit einem passenden **FormatProvider **benutzen.

Gruß Jürgen

1.564 Beiträge seit 2007
vor 14 Jahren

Hier eine ToDateTime Methode die ich manchmal verwende wenn ich von Usern eingegebene Werte parsen will:

      /// <summary>
      /// Converts a value to DateTime
      /// </summary>
      /// <param name="value">The value to convert</param>
      /// <returns>The converted value</returns>
      /// <exception cref="InvalidCastException"></exception>
      public static DateTime ToDateTime(object value)
      {
         #region ToDateTime

         if (value == null)
            return DateTime.MinValue;

         string s = value as string;
         if (s != null)
         {
            List<string> formats = new List<string>(50);
            System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

            #region Additional parsing masks for en-US, en-EN and de-DE

            if (culture.Name == "en-US")
            {
               #region en-US

               formats.AddRange
                  (
                     new string[] 
                     {
                        // Only Date
                        "MM/dd/yyyy HH:mm", "MM/d/yyyy", "M/dd/yyyy",
                        "MM/dd/yy HH:mm", "MM/d/yy", "M/dd/yy",
                        
                        // Only Time
                        "hh:mm tt", "hh:mm:ss tt", "hh:mm:ss.f tt", "hh:mm:ss.ff tt", "hh:mm:ss.fff tt",

                        // Date and Time
                        // Date and time with hours and minutes
                        "MM/dd/yyyy hh:mm tt", "MM/d/yyyy hh:mm tt", "M/dd/yyyy hh:mm tt",
                        "MM/dd/yy hh:mm tt", "MM/d/yy hh:mm tt", "M/dd/yy hh:mm tt",
                        // Date and time with hours, minutes and seconds
                        "MM/dd/yyyy hh:mm:ss tt", "MM/d/yyyy hh:mm:ss tt", "M/dd/yyyy hh:mm:ss tt",
                        "MM/dd/yy hh:mm:ss tt", "MM/d/yy hh:mm:ss tt", "M/dd/yy hh:mm:ss tt",
                        // Date and time with hours, minutes, seconds and one 1/10 seconds
                        "MM/dd/yyyy hh:mm:ss.f tt", "MM/d/yyyy hh:mm:ss.f tt", "M/dd/yyyy hh:mm:ss.f tt",
                        "MM/dd/yy hh:mm:ss.f tt", "MM/d/yy hh:mm:ss.f tt", "M/dd/yy hh:mm:ss.f tt",
                        // Date and time with hours, minutes, seconds and one 1/100 seconds
                        "MM/dd/yyyy hh:mm:ss.ff tt", "MM/d/yyyy hh:mm:ss.ff tt", "M/dd/yyyy hh:mm:ss.ff tt",
                        "MM/dd/yy hh:mm:ss.ff tt", "MM/d/yy hh:mm:ss.ff tt", "M/dd/yy hh:mm:ss.ff tt",
                        // Date and time with hours, minutes, seconds and one 1/1000 seconds
                        "MM/dd/yyyy hh:mm:ss.fff tt", "MM/d/yyyy hh:mm:ss.fff tt", "M/dd/yyyy hh:mm:ss.fff tt",
                        "MM/dd/yy hh:mm:ss.fff tt", "MM/d/yy hh:mm:ss.fff tt", "M/dd/yy hh:mm:ss.fff tt",
                     }
                  );

               #endregion
            }
            else if (culture.Name == "en-GB")
            {
               #region en-GB

               formats.AddRange
                  (
                     new string[] 
                     {
                        // Only Date
                        "dd/MM/yyyy HH:mm", "d/MM/yyyy", "dd/M/yyyy",
                        "dd/MM/yy HH:mm", "d/MM/yy", "dd/M/yy",
                        
                        // Only Time
                        "HH:mm", "HH:mm:ss", "HH:mm:ss.f", "HH:mm:ss.ff", "HH:mm:ss.fff",

                        // Date and Time
                        // Date and time with hours and minutes
                        "dd/MM/yyyy HH:mm", "d/MM/yyyy HH:mm", "dd/M/yyyy HH:mm",
                        "dd/MM/yy HH:mm", "d/MM/yy HH:mm", "dd/M/yy HH:mm",
                        // Date and time with hours, minutes and seconds
                        "dd/MM/yyyy HH:mm:ss", "d/MM/yyyy HH:mm:ss", "dd/M/yyyy HH:mm:ss",
                        "dd/MM/yy HH:mm:ss", "d/MM/yy HH:mm:ss", "dd/M/yy HH:mm:ss",
                        // Date and time with hours, minutes, seconds and one 1/10 seconds
                        "dd/MM/yyyy HH:mm:ss.f", "d/MM/yyyy HH:mm:ss.f", "dd/M/yyyy HH:mm:ss.f",
                        "dd/MM/yy HH:mm:ss.f", "d/MM/yy HH:mm:ss.f", "dd/M/yy HH:mm:ss.f",
                        // Date and time with hours, minutes, seconds and one 1/100 seconds
                        "dd/MM/yyyy HH:mm:ss.ff", "d/MM/yyyy HH:mm:ss.ff", "dd/M/yyyy HH:mm:ss.ff",
                        "dd/MM/yy HH:mm:ss.ff", "d/MM/yy HH:mm:ss.ff", "dd/M/yy HH:mm:ss.ff",
                        // Date and time with hours, minutes, seconds and one 1/1000 seconds
                        "dd/MM/yyyy HH:mm:ss.fff", "d/MM/yyyy HH:mm:ss.fff", "dd/M/yyyy HH:mm:ss.fff",
                        "dd/MM/yy HH:mm:ss.fff", "d/MM/yy HH:mm:ss.fff", "dd/M/yy HH:mm:ss.fff",
                     }
                  );

               #endregion
            }
            else if (culture.Name == "de-DE")
            {
               #region de-DE

               formats.AddRange
                  (
                     new string[] 
                     {
                        // Only Date
                        "dd.MM.yyyy HH:mm", "d.MM.yyyy", "dd.M.yyyy",
                        "dd.MM.yy HH:mm", "d.MM.yy", "dd.M.yy",
                        
                        // Only Time
                        "HH:mm", "HH:mm:ss", "HH:mm:ss.f", "HH:mm:ss.ff", "HH:mm:ss.fff",

                        // Date and Time
                        // Date and time with hours and minutes
                        "dd.MM.yyyy HH:mm", "d.MM.yyyy HH:mm", "dd.M.yyyy HH:mm",
                        "dd.MM.yy HH:mm", "d.MM.yy HH:mm", "dd.M.yy HH:mm",
                        // Date and time with hours, minutes and seconds
                        "dd.MM.yyyy HH:mm:ss", "d.MM.yyyy HH:mm:ss", "dd.M.yyyy HH:mm:ss",
                        "dd.MM.yy HH:mm:ss", "d.MM.yy HH:mm:ss", "dd.M.yy HH:mm:ss",
                        // Date and time with hours, minutes, seconds and one 1/10 seconds
                        "dd.MM.yyyy HH:mm:ss.f", "d.MM.yyyy HH:mm:ss.f", "dd.M.yyyy HH:mm:ss.f",
                        "dd.MM.yy HH:mm:ss.f", "d.MM.yy HH:mm:ss.f", "dd.M.yy HH:mm:ss.f",
                        // Date and time with hours, minutes, seconds and one 1/100 seconds
                        "dd.MM.yyyy HH:mm:ss.ff", "d.MM.yyyy HH:mm:ss.ff", "dd.M.yyyy HH:mm:ss.ff",
                        "dd.MM.yy HH:mm:ss.ff", "d.MM.yy HH:mm:ss.ff", "dd.M.yy HH:mm:ss.ff",
                        // Date and time with hours, minutes, seconds and one 1/1000 seconds
                        "dd.MM.yyyy HH:mm:ss.fff", "d.MM.yyyy HH:mm:ss.fff", "dd.M.yyyy HH:mm:ss.fff",
                        "dd.MM.yy HH:mm:ss.fff", "d.MM.yy HH:mm:ss.fff", "dd.M.yy HH:mm:ss.fff",
                     }
                  );

               #endregion
            }

            #endregion

            #region Culture specific parsing masks

            formats.AddRange
               (
                  new string[] 
                  { 
                     culture.DateTimeFormat.FullDateTimePattern,
                     culture.DateTimeFormat.LongDatePattern,
                     culture.DateTimeFormat.LongTimePattern,
                     culture.DateTimeFormat.MonthDayPattern,
                     culture.DateTimeFormat.RFC1123Pattern,
                     culture.DateTimeFormat.ShortDatePattern,
                     culture.DateTimeFormat.ShortTimePattern,
                     culture.DateTimeFormat.SortableDateTimePattern,
                     culture.DateTimeFormat.UniversalSortableDateTimePattern,
                     culture.DateTimeFormat.YearMonthPattern
                  }
               );
            
            #endregion

            #region Special parsing masks

            formats.AddRange
               (
                  new string[] 
                  { 
                  // ISO
                  "yyyyMMdd", 
                  "yyyyMMdd HH:mm", 
                  "yyyyMMdd HH:mm:ss", 
                  "yyyyMMdd HH:mm:ss.ff", 
                  "yyyyMMdd HH:mm:ss.fff",
                  // ISO 8601
                  "yyyy-MM-ddTHH:mm",
                  "yyyy-MM-ddTHH:mm:ss",
                  "yyyy-MM-ddTHH:mm:ss.fff",
                  // ODBC
                  "yyyy-MM-dd",
                  "yyyy-MM-dd HH:mm",
                  "yyyy-MM-dd HH:mm:ss",
                  "yyyy-MM-dd HH:mm:ss.fff"
               });
            
            #endregion

            DateTime dt;
            if (DateTime.TryParseExact(s, formats.ToArray(), null, System.Globalization.DateTimeStyles.None, out dt))
               return dt;
         }

         return Convert.ToDateTime(value);

         #endregion
      }

Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo mrdjoker,

Ehrlich gesagt sind mir RegEx zu kompliziert.

Regex ist nicht kompliziert, sondern eher trivial einfach. Wenn du dich auf Regex einlässt, wirst du das schnell merken. Regex ist eine de wenigen Sachen, von denen ich mein ganzes Informatikerleben immer und immer wieder profitiert habe. Der Aufwand, Regex zu lernen, zahlt sich schnell aus.

herbivore

M
mrdjoker Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren

Regex ist nicht kompliziert, sondern eher trivial einfach. Wenn du dich auf Regex einlässt, wirst du das schnell merken.

Du hast sicher Recht.
Doch wenn man sich noch nie damit beschäftigt hat, sehen die vielen Zeichen sehr cryptisch aus.
Als Leihe verstehe ich z.B. nicht, warum die folgende Zeile mir sämtliche Links zurückgibt:

 ^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$

Übrigens gibts hier eine nützliche Seite für Leihen:Regular Expressions Libary

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo mrdjoker,

streng genommen gibt diese Zeile nichts zurück, sie stellt lediglich ein Regex-Pattern dar. Aber das läuft auf Haarspalterei hinaus ...
Ich würde diese Zeile allerdings nicht zur Erkennung von URLs bzw. Links verwenden, da schon www.google.de nicht mehr gefunden wird (de-Endung nicht inbegriffen) ...

Du sprachst sicherlich von Laien 😛 ...

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo mrdjoker,

schau dir das [Artikel] Regex-Tutorial an. Dann wird dir schnell vieles klarer werden.

herbivore

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo mrdjoker,

zum Ausprobieren ist herbivores On-the-fly Regex-Tester: Regex-Lab sicherlich interessant für dich.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

M
mrdjoker Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren

Cooles Tutorial, hier werde ich in Zukunft öfter rein schauen.

Sorry für den Augenkrebs =)