C# DateTime 解析 - 格式不一致
C# DateTime Parsing - inconsistent format
我有一个示例日期/时间字符串,我需要将其转换为 datetimeoffset。
存在一个巨大的不一致 - 如果一个月中的第几天 < 10 则月和日之间有一个双 space,否则只有一个 space.
例如:'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.
我知道我可以用单个 space 搜索和替换双 space 字符,但是有没有更优雅的方法来使用格式字符串实现此目的?
这个问题似乎有一些评论(包括我自己关于使用 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: String was not recognized as a valid 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*
标志的用途:它们指示解析器忽略日期字符串中的白色 space。
在您的情况下,字符串以缩写的工作日名称开头,因此如果是一位数的日期,则该标志至少足以忽略额外的 space
DateTimeStyles.AllowInnerWhite
此标志和相关标志记录在此处:https://docs.microsoft.com/en-us/dotnet/api/system.globalization.datetimestyles?view=netframework-4.7.2
我有一个示例日期/时间字符串,我需要将其转换为 datetimeoffset。
存在一个巨大的不一致 - 如果一个月中的第几天 < 10 则月和日之间有一个双 space,否则只有一个 space.
例如:'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.
我知道我可以用单个 space 搜索和替换双 space 字符,但是有没有更优雅的方法来使用格式字符串实现此目的?
这个问题似乎有一些评论(包括我自己关于使用 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: String was not recognized as a valid 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*
标志的用途:它们指示解析器忽略日期字符串中的白色 space。
在您的情况下,字符串以缩写的工作日名称开头,因此如果是一位数的日期,则该标志至少足以忽略额外的 space
DateTimeStyles.AllowInnerWhite
此标志和相关标志记录在此处:https://docs.microsoft.com/en-us/dotnet/api/system.globalization.datetimestyles?view=netframework-4.7.2