如何将以下字符串解析为DateTime?

时间:2015-08-07 19:51:49

标签: c#

这是一个非常奇怪的日期,在我从JSON中的某些API返回之前从未见过。

public boolean doubleBet(MenuItem view){ Intent intent = new Intent(this, DisplayMessageActivity.class); String x = "Hello"; intent.putExtra("key", x); //Optional parameters startActivity(intent); return true; }

这会产生以下错误:

"Tue Aug 04 2015 00:17:38 GMT+0000 (UTC)"

使用以下方法解析时可以理解:

System.FormatException: String was not recognized as a valid DateTime.

任何处理复杂日期格式的人都知道如何解析它?

1 个答案:

答案 0 :(得分:7)

您可以使用DateTime.ParseExact方法(或DateTime.TryParseExact来干净地处理解析失败)来完成此任务。这些方法允许您显式指定格式字符串。

这样的事情可行:

var dateString = "Tue Aug 04 2015 00:17:38 GMT+0000 (UTC)";
var format = "ddd MMM dd yyyy HH:mm:ss GMT+0000 (UTC)";

var parsed = DateTime.ParseExact(
    dateString, 
    format, 
    System.Globalization.CultureInfo.InvariantCulture);

或者,使用TryParseExact

DateTime parsed;
if (DateTime.TryParseExact(
   dateString, 
   format, 
   System.Globalization.CultureInfo.InvariantCulture, 
   DateTimeStyles.None, 
   out parsed) 
{
   // parsing was successful
}
else
{
   // parsing failed
}

以下是此处使用的格式字符串的细分:

  • ddd - 星期几的缩写名称。
  • MMM - 月份的缩写名称。
  • dd - 该月的某一天,即01至31日。
  • yyyy - 作为四位数的年份。
  • HH:mm:ss - 小时,使用从00到23的24小时制;分钟,从00到59;第二个,从0到59(由:个字符分隔)。
  • GMT+0000 (UTC) - 格式字符串假定的静态文本将始终存在。这非常脆弱,如果API在此处返回不同的文本,可能会导致解析失败。考虑截断此文本,或使用NodaTime,它为时区提供了很好的支持。

您可能需要根据您的使用情况略微调整此格式字符串 - 例如,无论您使用的是12小时制还是24小时制,都无法清除您的问题。

有关如何构建格式字符串的详细信息,请参阅MSDN上的Custom Date and Time Format Strings

或者,您可以避免使用System.DateTime支持NodaTime。我自己对NodaTime不太熟悉,但是here on StackOverflow和NodaTime网站都提供了很好的文档。