@@ -50,36 +50,75 @@ public static System.Configuration.Configuration GetConfigurationForAssembly(thi
5050 return instanceOfTypeFromAssembly . GetType ( ) . Assembly . GetAssemblyConfiguration ( ) ;
5151 }
5252
53+ /// <summary>
54+ /// Cuts down resolution of <see cref="DateTime"/> value if needed, according to current <see cref="StorageProviderInfo.Instance"/>.
55+ /// </summary>
56+ /// <param name="origin">The value to adjust.</param>
57+ /// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
58+ public static DateTime AdjustDateTimeForCurrentProvider ( this DateTime origin )
59+ {
60+ var provider = StorageProviderInfo . Instance ;
61+ return AdjustDateTimeForProvider ( origin , provider ) ;
62+ }
63+
5364 /// <summary>
5465 /// Cuts down resolution of <see cref="DateTime"/> value if needed.
5566 /// </summary>
5667 /// <param name="origin">The value to fix.</param>
5768 /// <param name="provider">Type of provider.</param>
5869 /// <returns>New value with less resolution if <paramref name="provider"/> requires it or untouched <paramref name="origin"/> if the provider doesn't</returns>
59- public static DateTime FixDateTimeForProvider ( this DateTime origin , StorageProviderInfo providerInfo )
70+ public static DateTime AdjustDateTimeForProvider ( this DateTime origin , StorageProviderInfo providerInfo )
6071 {
61- long ? divider ;
6272 var provider = providerInfo . Provider ;
6373 switch ( provider ) {
6474 case StorageProvider . MySql :
65- divider = providerInfo . Info . StorageVersion < StorageProviderVersion . MySql56 ? 10000000 : 10 ;
66- break ;
75+ return providerInfo . Info . StorageVersion < StorageProviderVersion . MySql56
76+ ? AdjustDateTime ( origin , 0 )
77+ : AdjustDateTime ( origin , 6 ) ;
6778 case StorageProvider . Firebird :
68- divider = 1000 ;
69- break ;
79+ return AdjustDateTime ( origin , 4 ) ;
7080 case StorageProvider . PostgreSql :
71- divider = 10 ;
72- break ;
81+ return AdjustDateTime ( origin , 6 ) ;
82+ case StorageProvider . Oracle :
83+ return AdjustDateTime ( origin , 7 ) ;
7384 default :
74- divider = null ;
75- break ;
85+ return origin ;
7686 }
87+ }
7788
78- if ( ! divider . HasValue ) {
89+ /// <summary>
90+ /// Cuts down fractions of <see cref="DateTime"/> value (nanoseconds, milliseconds, etc) to desired value.
91+ /// </summary>
92+ /// <param name="origin"></param>
93+ /// <param name="desiredFractions">Number of fractional points to keep (from 0 to 7).</param>
94+ /// <param name="requireRound">Indicates whether value should be rounded after cutting off.</param>
95+ /// <returns>Result value.</returns>
96+ /// <exception cref="ArgumentOutOfRangeException">Valid fractions should be between 0 and 7 (7 included).</exception>
97+ public static DateTime AdjustDateTime ( this DateTime origin , byte desiredFractions , bool requireRound = false )
98+ {
99+ if ( desiredFractions == 7 ) {
79100 return origin ;
80101 }
102+
103+ const int baseDivider = 10_000_000 ; // no fractions
104+ var currentDivider = baseDivider / ( desiredFractions switch {
105+ 0 => 1 ,
106+ 1 => 10 ,
107+ 2 => 100 ,
108+ 3 => 1000 ,
109+ 4 => 10000 ,
110+ 5 => 100000 ,
111+ 6 => 1000000 ,
112+ _ => throw new ArgumentOutOfRangeException ( nameof ( desiredFractions ) )
113+ } ) ;
114+
81115 var ticks = origin . Ticks ;
82- var newTicks = ticks - ( ticks % divider . Value ) ;
116+
117+ var newTicks = requireRound
118+ ? ( ( ticks % currentDivider ) / ( currentDivider / 10 ) ) >= 5
119+ ? ticks - ( ticks % currentDivider ) + currentDivider
120+ : ticks - ( ticks % currentDivider )
121+ : ticks - ( ticks % currentDivider ) ;
83122 return new DateTime ( newTicks ) ;
84123 }
85124 }
0 commit comments