C#日期时间分析-格式不一致



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

有一个巨大的不一致性——如果一个月的哪一天<10则在Month和Day之间有两个空格,否则只有一个空格。

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

我目前使用CCD_ 3来解析它;10带错误:

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

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

这个问题似乎有一些评论(包括我自己关于使用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日是星期五,而不是星期二。

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

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

DateTimeStyles.AllowInnerWhite

此处记录了此标志和相关标志:https://learn.microsoft.com/en-us/dotnet/api/system.globalization.datetimestyles?view=netframework-4.7.2

最新更新