【问题标题】:How to parse custom string to DateTime C#?如何将自定义字符串解析为 DateTime C#?
【发布时间】:2017-08-20 10:55:05
【问题描述】:

我需要解析到以下日期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} 时使用它

在这种情况下我可以使用什么其他解决方案

【问题讨论】:

标签: c# datetime


【解决方案1】:

首先,不要忘记您的字符串包含"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

【讨论】:

    【解决方案2】:

    如果这是你的字符串:

    "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 来说明如何做到这一点。

    【讨论】:

      【解决方案3】:

      如果这是输入,我建议您将格式与输入完全相同

      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 替换以匹配小时分隔符。如果您总是需要文字冒号,请使用 \:

      正如我之前在 cmets 中所写,请注意您是 ignoring the time zone

      【讨论】:

        【解决方案4】:

        使用以下代码

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-26
          • 2011-07-18
          • 2013-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多