我有一个示例日期/时间字符串,需要将其转换为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