从字符串中获取DateTime

时间:2013-09-13 09:05:23

标签: c# datetime datetime-parsing

我有一些DateTime的字符串,有些没有。我必须找出每个字符串是否包含DateTime。

请帮帮我。

字符串示例(俄语):

13 сентября 2013 г., 11:27 пользователь  <support@example.com> написал:

13 сентября 2013 г., 11:29 пользователь Вячеслав Равдин <someone@example.com> написал:

13.09.2013, в 11:27, support@example.com написал(а):

3 个答案:

答案 0 :(得分: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方法各自查找特定的正则表达式:

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

通过这种方式,您可以根据需要进行匹配(使用或不使用正则表达式),并使它们尽可能复杂。

答案 1 :(得分: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?

答案 2 :(得分: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 пользователь  <support@example.com> написал:";

var ext = ExtractDateTime(d);