@@ -8,10 +8,6 @@ namespace TypeGuesser.Deciders;
88/// <summary>
99/// Guesses whether strings are <see cref="DateTime"/> and handles parsing approved strings according to the <see cref="Culture"/>
1010/// </summary>
11- /// <remarks>
12- /// Creates a new instance for detecting/parsing <see cref="DateTime"/> strings according to the <paramref name="cultureInfo"/>
13- /// </remarks>
14- /// <param name="cultureInfo"></param>
1511public class DateTimeTypeDecider : DecideTypesForStrings < DateTime >
1612{
1713 private readonly TimeSpanTypeDecider _timeSpanTypeDecider ;
@@ -75,41 +71,48 @@ public override CultureInfo Culture
7571
7672 static DateTimeTypeDecider ( )
7773 {
78- var dateFormatsMd = new List < string > ( ) ;
79- var dateFormatsDm = new List < string > ( ) ;
80- var timeFormats = new List < string > ( ) ;
81-
8274 //all dates on their own
83- foreach ( var y in YearFormats )
84- foreach ( var m in MonthFormats )
85- foreach ( var d in DayFormats )
86- foreach ( var dateSeparator in DateSeparators )
87- {
88- dateFormatsMd . Add ( string . Join ( dateSeparator , m , d , y ) ) ;
89- dateFormatsMd . Add ( string . Join ( dateSeparator , y , m , d ) ) ;
90-
91- dateFormatsDm . Add ( string . Join ( dateSeparator , d , m , y ) ) ;
92- dateFormatsMd . Add ( string . Join ( dateSeparator , y , m , d ) ) ;
93- }
75+ var dateFormatsMd = ( from y in YearFormats
76+ from m in MonthFormats
77+ from d in DayFormats
78+ from dateSeparator in DateSeparators
79+ from format in new [ ] {
80+ string . Join ( dateSeparator , m , d , y ) ,
81+ string . Join ( dateSeparator , y , m , d )
82+ }
83+ select format ) . ToArray ( ) ;
84+
85+ var dateFormatsDm = ( from y in YearFormats
86+ from m in MonthFormats
87+ from d in DayFormats
88+ from dateSeparator in DateSeparators
89+ from format in new [ ] {
90+ string . Join ( dateSeparator , d , m , y ) ,
91+ string . Join ( dateSeparator , y , m , d )
92+ }
93+ select format ) . ToArray ( ) ;
9494
9595 //then all the times
96- foreach ( var timeSeparator in TimeSeparators )
97- foreach ( var suffix in Suffixes )
98- foreach ( var h in HourFormats )
99- foreach ( var m in MinuteFormats )
100- {
101- timeFormats . Add ( string . Join ( timeSeparator , h , m ) ) ;
102- timeFormats . Add ( $ "{ string . Join ( timeSeparator , h , m ) } { suffix } ") ;
103-
104- foreach ( var s in SecondFormats )
105- {
106- timeFormats . Add ( string . Join ( timeSeparator , h , m , s ) ) ;
107- timeFormats . Add ( $ "{ string . Join ( timeSeparator , h , m , s ) } { suffix } ") ;
108- }
109- }
110- DateFormatsDM = [ .. dateFormatsDm ] ;
111- DateFormatsMD = [ .. dateFormatsMd ] ;
112- TimeFormats = [ .. timeFormats ] ;
96+ var timeFormats = ( from timeSeparator in TimeSeparators
97+ from suffix in Suffixes
98+ from h in HourFormats
99+ from m in MinuteFormats
100+ from format in new [ ] {
101+ string . Join ( timeSeparator , h , m ) ,
102+ $ "{ string . Join ( timeSeparator , h , m ) } { suffix } "
103+ } . Concat (
104+ from s in SecondFormats
105+ from fmt in new [ ] {
106+ string . Join ( timeSeparator , h , m , s ) ,
107+ $ "{ string . Join ( timeSeparator , h , m , s ) } { suffix } "
108+ }
109+ select fmt
110+ )
111+ select format ) . ToArray ( ) ;
112+
113+ DateFormatsDM = dateFormatsDm ;
114+ DateFormatsMD = dateFormatsMd ;
115+ TimeFormats = timeFormats ;
113116 }
114117
115118 private static readonly string [ ] YearFormats = [
@@ -179,7 +182,7 @@ protected override object ParseImpl(ReadOnlySpan<char> value)
179182
180183 // otherwise parse a value using any of the valid culture formats
181184 if ( ! TryBruteParse ( value , out var dt ) )
182- throw new FormatException ( ErrorFormatters . DateTimeParseError ( value . ToString ( ) ) ) ;
185+ throw new FormatException ( ErrorFormatters . DateTimeParseError ( new string ( value ) ) ) ;
183186
184187 return dt ;
185188 }
@@ -241,14 +244,8 @@ protected override bool IsAcceptableAsTypeImpl(ReadOnlySpan<char> candidateStrin
241244 if ( _timeSpanTypeDecider . IsAcceptableAsType ( candidateString , sizeRecord ) )
242245 return false ;
243246
244- try
245- {
246- return TryBruteParse ( candidateString , out _ ) ;
247- }
248- catch ( Exception )
249- {
250- return false ;
251- }
247+ // TryBruteParse already handles all exceptions internally and returns false on failure
248+ return TryBruteParse ( candidateString , out _ ) ;
252249 }
253250
254251 private bool TryBruteParse ( ReadOnlySpan < char > s , out DateTime dt )
0 commit comments