2013-09-13 7 views
-1

У меня есть несколько строк с DateTime и некоторые без. Я должен выяснить, содержит ли каждая из строк DateTime.Получить DateTime из строки

Пожалуйста, помогите мне с этим.

примеры строк (на русском языке):

13 сентября 2013 г., 11:27 пользователь <[email protected]> написал: 

13 сентября 2013 г., 11:29 пользователь Вячеслав Равдин <[email protected]> написал: 

13.09.2013, в 11:27, [email protected] написал(а): 
+0

Что вы пробовали? Можете ли вы показать код? Что не сработало? Любые ошибки? Исключения? – Oded

+0

Попробуйте 'DateTime.ParseExact', передав альтернативные форматы. – I4V

+0

Возможная помощь здесь: http://stackoverflow.com/questions/7854529/unable-to-parse-datetime-from-a-string – Atlasmaybe

ответ

1

Вам нужно создать Regex для каждой из моделей, которые вы хотите узнать, то соответствие строк с каждым Regex, пока вы не спичкой или пока у вас есть попробовал все Regex es.

public bool TryParseDate(string input, out DateTime result) 
{ 
    if (MatchPattern1(input, result)) 
    { 
     return true; 
    } 
    if (MatchPattern2(input, result)) 
    { 
     return true; 
    } 
    ... 
    return false; 
} 

где MatchPattern методы каждый ищет конкретного Regex:

private bool MatchPattern1(string input, out DateTime result) 
{ 
    Match match = Regex.Match(input, @"*pattern here*"); 
    if (match.Success) 
    { 
     result = *build date based on matches*; 
     return true; 
    } 
    return false; 
} 

Таким образом, вы можете сделать ваше соответствие, однако вы хотите (с или без регулярных выражений) и сделать их так сложно, как вы хотеть.

+2

Которая получит часть даты в строке, но не проверит ее на 'DateTime' – Oded

+0

@Oded, это то, что общая строка 'result = * дата сборки на основе совпадений *;' для. –

+0

Это еще слишком общий ИМХО;) - это похоже на 'result = * здесь происходит какая-то магия * – Oded

1

Вы можете использовать DateTime.TryParseExact с русской культурой и правильными строками формата.

string russianLines = @" 
13 сентября 2013 г., 11:27 пользователь написал: 
13 сентября 2013 г., 11:29 пользователь Вячеслав Равдин написал: 
13.09.2013, в 11:27, blablahblah..."; 

CultureInfo ruCult = CultureInfo.CreateSpecificCulture("ru-RU"); 
string[] formats = new[]{"dd MMMM yyyy", "dd.MM.yyyy"}; 
string[] lines = russianLines.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
var lineDates = new List<DateTime?>(); 
foreach (string line in lines) 
{ 
    string strDate = null; 
    string[] tokens = line.Split(','); 
    string[] parts = tokens.First().Split(); 
    if (parts.Length == 1) 
     strDate = parts.First(); 
    else 
     strDate = string.Join(" ", parts.Take(3)); 
    DateTime dt; 
    if(DateTime.TryParseExact(strDate, formats, ruCult, DateTimeStyles.None, out dt)) 
     lineDates.Add(dt); 
    else 
     lineDates.Add(null); 
} 

Результат в отладчике:

[0] {13.09.2013 00:00:00} System.DateTime? 
[1] {13.09.2013 00:00:00} System.DateTime? 
[2] {13.09.2013 00:00:00} System.DateTime? 
0

Вы можете трей что-то вроде этого

Первый

изменить культуру

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ru"); 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru"); 

Второй

попробовать Синтаксический ваша строка

private static DateTime ExtractDateTime(string str) 
    { 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ru"); 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru"); 
     string[] date = str.Split(','); 

     string[] needeedate = {""}; 

     needeedate[0] = date[0]; 
     for (var i = 1; i < date.Length; i++) 
     { 
      string[] temp1 = date[i].Split(' '); 

      foreach (var temp in from s in temp1 where !String.IsNullOrEmpty(s) select needeedate[0] + " , " + s) 
      { 
       try 
       { 
        var res = DateTime.Parse(temp); 
        needeedate[0] = temp; 
       } 
       catch (Exception) 
       { 
        return DateTime.Parse(needeedate[0]); 
       } 
      } 
     } 

     return new DateTime(); 
    } 

Пример

string d = "13 сентября 2013 г., 11:27 пользователь <[email protected]> написал:"; 

var ext = ExtractDateTime(d); 
Смежные вопросы