@@ -50,61 +50,98 @@ 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>
56- /// <param name="origin">The value to fix .</param>
57- /// <param name="provider ">Type of provider.</param>
58- /// <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 )
67+ /// <param name="origin">The value to adjust .</param>
68+ /// <param name="providerInfo ">Type of provider.</param>
69+ /// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>. </returns>
70+ private static DateTime AdjustDateTimeForProvider ( this DateTime origin , StorageProviderInfo providerInfo )
6071 {
61- long ? divider ;
72+ // long? divider;
6273 var provider = providerInfo . Provider ;
6374 switch ( provider ) {
6475 case StorageProvider . MySql :
65- divider = providerInfo . Info . StorageVersion < StorageProviderVersion . MySql56 ? 10000000 : 10 ;
66- break ;
76+ return providerInfo . Info . StorageVersion < StorageProviderVersion . MySql56
77+ ? AdjustDateTime ( origin , 0 )
78+ : AdjustDateTime ( origin , 6 ) ;
6779 case StorageProvider . Firebird :
68- divider = 1000 ;
69- break ;
80+ return AdjustDateTime ( origin , 4 ) ;
7081 case StorageProvider . PostgreSql :
71- divider = 10 ;
72- break ;
82+ return AdjustDateTime ( origin , 6 ) ;
7383 case StorageProvider . Oracle :
74- divider = 10 ;
75- break ;
84+ return AdjustDateTime ( origin , 6 , true ) ;
7685 default :
77- divider = null ;
78- break ;
86+ return origin ;
7987 }
88+ }
8089
81- if ( ! divider . HasValue ) {
90+ /// <summary>
91+ /// Cuts down fractions of <see cref="DateTime"/> value (nanoseconds, milliseconds, etc) to desired value.
92+ /// </summary>
93+ /// <param name="origin"></param>
94+ /// <param name="desiredFractions">Number of fractional points to keep.</param>
95+ /// <param name="requireRound">Indicates whether value should be rounded after cutting off.</param>
96+ /// <returns>Result value.</returns>
97+ /// <exception cref="ArgumentOutOfRangeException">Valid fractions should be between 0 and 7 (7 included).</exception>
98+ public static DateTime AdjustDateTime ( this DateTime origin , byte desiredFractions = 7 , bool requireRound = false )
99+ {
100+ if ( desiredFractions == 7 ) {
82101 return origin ;
83102 }
103+
104+ const int baseDivider = 10_000_000 ; // no fractions
105+ var currentDivider = baseDivider / ( desiredFractions switch {
106+ 0 => 1 ,
107+ 1 => 10 ,
108+ 2 => 100 ,
109+ 3 => 1000 ,
110+ 4 => 10000 ,
111+ 5 => 100000 ,
112+ 6 => 1000000 ,
113+ _ => throw new ArgumentOutOfRangeException ( nameof ( desiredFractions ) )
114+ } ) ;
115+
84116 var ticks = origin . Ticks ;
85- if ( provider == StorageProvider . Oracle ) {
86- var ticks1 = ( ticks % divider ) >= 5 ? ticks - ( ticks % divider . Value ) + divider . Value
87- : ticks - ( ticks % divider . Value ) ;
88- return new DateTime ( ticks1 ) ;
89- }
90- if ( provider == StorageProvider . MySql ) {
91- var abc = ( ( ticks % 10000000 ) / 1000000 ) ;
92- var ticks1 = ( ( ticks % 10000000 ) / 1000000 ) >= 5 ? ticks - ( ticks % 10000000 ) + 10000000
93- : ticks - ( ticks % 10000000 ) ;
94- return new DateTime ( ticks1 ) ;
95- }
96- var newTicks = ticks - ( ticks % divider . Value ) ;
117+
118+ var newTicks = requireRound
119+ ? ( ( ticks % currentDivider ) / ( currentDivider / 10 ) ) >= 5
120+ ? ticks - ( ticks % currentDivider ) + currentDivider
121+ : ticks - ( ticks % currentDivider )
122+ : ticks - ( ticks % currentDivider ) ;
97123 return new DateTime ( newTicks ) ;
98124 }
99125
100126#if NET6_0_OR_GREATER //DO_DATEONLY
127+ /// <summary>
128+ /// Cuts down resolution of <see cref="TimeOnly"/> value if needed, according to current <see cref="StorageProviderInfo.Instance"/>.
129+ /// </summary>
130+ /// <param name="origin">The value to adjust.</param>
131+ /// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
132+ public static TimeOnly AdjustTimeOnlyForCurrentProvider ( this TimeOnly origin )
133+ {
134+ var provider = StorageProviderInfo . Instance ;
135+ return AdjustTimeOnlyForProvider ( origin , provider ) ;
136+ }
137+
101138 /// <summary>
102139 /// Cuts down resolution of <see cref="TimeOnly"/> value if needed.
103140 /// </summary>
104- /// <param name="origin">The value to fix .</param>
105- /// <param name="provider ">Type of provider.</param>
106- /// <returns>New value with less resolution if <paramref name=" provider"/> requires it or untouched <paramref name="origin"/> if the provider doesn't </returns>
107- public static TimeOnly FixTimeOnlyForProvider ( this TimeOnly origin , StorageProviderInfo providerInfo )
141+ /// <param name="origin">The value to adjust .</param>
142+ /// <param name="providerInfo ">Type of provider.</param>
143+ /// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>. </returns>
144+ public static TimeOnly AdjustTimeOnlyForProvider ( this TimeOnly origin , StorageProviderInfo providerInfo )
108145 {
109146 long ? divider ;
110147 var provider = providerInfo . Provider ;
0 commit comments