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

Lou*_*caj 3 c#

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

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

这会产生以下错误:

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

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

DateTime.Parse(x.process_date.Value)
Run Code Online (Sandbox Code Playgroud)

有人处理过复杂的日期格式,可能知道如何解析它吗?

Don*_*nut 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);
Run Code Online (Sandbox Code Playgroud)

或者,使用TryParseExact:

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

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

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

您可能需要稍微调整此格式字符串以适应您的使用情况 - 例如,您的问题不清楚您是使用12小时制还是24小时制.

有关如何构建格式字符串的详细信息,请参阅MSDN上的自定义日期和时间格式字符串.

或者,你可以避开使用System.DateTime有利于NodaTime.我自己对NodaTime不太熟悉,但是在StackOverflow和NodaTime的网站上都有很好的文档.