如何将自定义字符串解析为DateTime C#?

时间:2017-08-20 10:55:05

标签: c# datetime

我需要解析以下日期Aug 20 11:38:43 2017 GMT 我正在尝试使用DateTime.TryParseExact,但无法找到正确的格式。

我的最新格式为MMM dd hh:mm:ss yyyy

我的代码:

string nextUpdate; //Next Update: Aug 20 11:38:43 2017 GMT
string dateTimeFormat =          "MMM dd hh:mm:ss yyyy";
DateTime crldt;
DateTime.TryParseExact(nextUpdate.Split(':')[1].Trim(), dateTimeFormat, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out crldt);

当我运行代码时,我得到了crldt~Date = {1/1/01 12:00:00 AM}

我的问题:我应该使用什么格式或者我可以使用哪种替代方法将此字符串解析为DateTime

更新

使用以下建议:@Sergey Berezovskiy 我已将代码更新为:

    string nextUpdate; //  Next Update: Oct  7 06:16:18 2017 GMT
    string dateTimeFormat = @"MMM dd HH:mm:ss yyyy \G\M\T";
    Regex r =new Regex(".*Next Update:.*");
    nextUpdate = r.Match(Crltext).Value;
    DateTime crldt;             


  DateTime.TryParseExact(nextUpdate.Substring(nextUpdate.IndexOf(':')+1).Trim(),
  dateTimeFormat, System.Globalization.CultureInfo.InvariantCulture, 
  System.Globalization.DateTimeStyles.AssumeUniversal, out crldt);
  int intDTComp = DateTime.Compare(crldt, DT_now);

我发现了一个不符合此格式的日期:Next Update: Oct 7 06:16:18 2017 GMT 现在的问题是什么?

更新2

我发现了这个问题,但找不到干净的解决方案。 问题是有问题的日期是Oct 7 ..., 格式为MMM dd ...

我的解决方法是添加另一种格式MMM d hh:mm:ss yyyy并在date = {1/1/01 12:00:00 AM}

时使用它

我可以在此场景中使用其他解决方案

4 个答案:

答案 0 :(得分:2)

首先,不要忘记你的字符串包含"GMT"。您应该从字符串中删除它,或添加格式模式:

string nextUpdate = "Next Update: Aug 20 11:38:43 2017 GMT";
string format = @"MMM dd hh:mm:ss yyyy \G\M\T";

下一步 - 不要将输入字符串拆分为:,因为字符串中还有另外:个符号。你会得到包含["Next Update", " Aug 20 11", "38", "43 2017 GMT"]部分的数组。从数组中取第二个项目可以得到" Aug 20 11"。相反,你应该在第一次:出现之后取出子串:

string s = nextUpdate.Substring(nextUpdate.IndexOf(':') + 1).Trim();

最后使用您的格式解析该字符串:

IFormatProvider provider = CultureInfo.InvariantCulture;
DateTime date = DateTime.ParseExact(s, format, provider, DateTimeStyles.AssumeUniversal);

输出取决于您的时区。例如。对于我的时区GMT + 3,它将是:

8/20/2017 14:38:43

答案 1 :(得分:1)

如果这是你的字符串:

"Next Update: Aug 20 11:38:43 2017 GMT"

然后当你这样做时:

nextUpdate.Split(':')[1].Trim()

你明白了:

"Aug 20 11"

与您的日期格式不符。我怀疑你不只是想要第二个分割值,而是所有剩余的分割值。您可以重新加入它们。像这样:

string.Join(":", nextUpdate.Split(':').Skip(1)).Trim()

这将按":"字符拆分它们,跳过第一个字符但保留所有剩余的字符,然后将剩余的字符重新加入另一个字符串中再加上":"字符。

注意:您可能还需要考虑该时区值。对于如何做到这一点,有一些有用的想法on this question

答案 2 :(得分:1)

如果是输入,我建议你采用与输入完全相同的格式

string nextUpdate = "Next Update: Aug 20 11:38:43 2017 GMT";
string dateTimeFormat = @"\N\e\x\t\ \U\p\d\a\t\e\:\ MMM dd hh:mm:ss yyyy\ \G\M\T";
DateTime crldt;
crldt = DateTime.ParseExact(nextUpdate, dateTimeFormat , System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);

这样,在阅读代码时,它非常清楚预期的格式是什么,并且您没有代码Split()或其他需要解释的项目。

另请注意,如果您保留冒号(:),则可以使用.NET替换它们以匹配小时分隔符。如果您总是需要字面冒号,请使用\:

正如我之前在评论中写的那样,请注意你ignoring the time zone

答案 3 :(得分:1)

使用以下代码

CultureInfo provider = CultureInfo.InvariantCulture;
DateTime givenDate = DateTime.ParseExact("Aug 20 14:38:43 2017 GMT", "MMM dd HH:mm:ss yyyy GMT", provider); // here HH is for 24 hour format . use hh for 12 hour format
string expectedDate = givenDate.ToString("dd/MM/yy hh:mm:ss tt");  // tt is for AM or PM (no need to use tt if you use hour as HH I mean 24 hour format)

您的输出将为20/08/17 11:38:43 AM