C#DateTime解析-格式不一致

时间:2018-12-04 22:54:13

标签: c# datetime datetime-format

我有一个示例日期/时间字符串,我需要将其转换为datetimeoffset。

存在一个巨大的不一致-如果月份中的某天<10,则月份和日期之间会有一个双空格,否则只有一个空格。

例如:'Tue Dec 4 22:39:38 UTC 2018''Tue Dec 14 22:39:38 UTC 2018'

我目前使用DateTimeOffset.ParseExact(dateTime, "ddd MMM dd HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)进行解析,对于日期<10的日期失败,并显示以下错误:

FormatException: String 'Tue Dec  4 22:52:42 UTC 2018' was not recognized as a valid DateTime.

我知道我可以用单个空格搜索和替换双空格字符,但是有没有更优雅的方式使用格式字符串来实现这一点?

2 个答案:

答案 0 :(得分:5)

这个问题似乎有一些评论(包括我自己关于使用AllowLeadingWhite的错误评论(我的意思是AllowInnerWhite)。

但是,仅对现有格式字符串使用AllowInnerWhite仍然会产生错误:

Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec  4 22:39:38 UTC 2018", "ddd MMM dd HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));

产生:

  

FormatException:无法将字符串识别为有效的DateTime。

但是,从另一个角度看,为什么不更改日期格式本身以允许一位数字日期。使用"ddd MMM d HH:mm:ss UTC yyyy"(实际日期带有单个“ d”,而不是“ dd”):

Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec  4 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));
Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec 11 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));
Console.WriteLine(DateTimeOffset.ParseExact("Fri Dec 14 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));

请注意,您的示例数据'Tue Dec 14 22:39:38 UTC 2018'将失败,因为2018年12月14日是星期五,而不是星期二。

答案 1 :(得分:3)

这就是DateTimeStyles.Allow*标志的作用:它们指示解析器忽略日期字符串中的空格。

在您的情况下,字符串以缩写的工作日名称开头,因此,如果数字为一位,则该标志至少足以忽略额外的空间

DateTimeStyles.AllowInnerWhite

此标志和相关标志记录在这里:https://docs.microsoft.com/en-us/dotnet/api/system.globalization.datetimestyles?view=netframework-4.7.2