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
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
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.
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
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ß.
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
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
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
Hallo mrdjoker,
schau dir das [Artikel] Regex-Tutorial an. Dann wird dir schnell vieles klarer werden.
herbivore
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
Cooles Tutorial, hier werde ich in Zukunft öfter rein schauen.
Sorry für den Augenkrebs =)