@@ -77,7 +77,7 @@ private static string FormatTimeSpan(TimeSpan timeSpan, List<string> tokens, Cul
77
77
// The timeSpan input is then truncated to the remainder fraction, which is used to format mm and/or ss.
78
78
var result = new StringBuilder ( ) ;
79
79
var containsMilliseconds = false ;
80
- for ( var i = tokens . Count - 1 ; i >= 0 ; i -- )
80
+ for ( var i = tokens . Count - 1 ; i >= 0 ; i -- )
81
81
{
82
82
if ( tokens [ i ] . StartsWith ( ".0" ) )
83
83
{
@@ -98,16 +98,9 @@ private static string FormatTimeSpan(TimeSpan timeSpan, List<string> tokens, Cul
98
98
}
99
99
else if ( token . StartsWith ( "s" , StringComparison . OrdinalIgnoreCase ) )
100
100
{
101
- var value = timeSpan . Seconds ;
102
- if ( ! containsMilliseconds )
103
- {
104
- var roundedMilliseconds = GetRoundedMilliseconds ( timeSpan ) ;
105
-
106
- if ( roundedMilliseconds >= 500 )
107
- {
108
- value += 1 ;
109
- }
110
- }
101
+ // If format does not include ms, then include ms in seconds and round before printing
102
+ var formatMs = containsMilliseconds ? 0 : timeSpan . Milliseconds / 1000D ;
103
+ var value = ( int ) Math . Round ( timeSpan . Seconds + formatMs , 0 , MidpointRounding . AwayFromZero ) ;
111
104
var digits = token . Length ;
112
105
result . Append ( value . ToString ( "D" + digits ) ) ;
113
106
}
@@ -116,24 +109,24 @@ private static string FormatTimeSpan(TimeSpan timeSpan, List<string> tokens, Cul
116
109
var value = ( int ) timeSpan . TotalHours ;
117
110
var digits = token . Length - 2 ;
118
111
result . Append ( value . ToString ( "D" + digits ) ) ;
119
- timeSpan = TimeSpan . FromHours ( timeSpan . TotalHours - value ) ;
112
+ timeSpan = new TimeSpan ( 0 , 0 , Math . Abs ( timeSpan . Minutes ) , Math . Abs ( timeSpan . Seconds ) , Math . Abs ( timeSpan . Milliseconds ) ) ;
120
113
}
121
114
else if ( token . StartsWith ( "[m" , StringComparison . OrdinalIgnoreCase ) )
122
115
{
123
116
var value = ( int ) timeSpan . TotalMinutes ;
124
117
var digits = token . Length - 2 ;
125
118
result . Append ( value . ToString ( "D" + digits ) ) ;
126
- timeSpan = TimeSpan . FromMinutes ( timeSpan . TotalMinutes - value ) ;
119
+ timeSpan = new TimeSpan ( 0 , 0 , 0 , Math . Abs ( timeSpan . Seconds ) , Math . Abs ( timeSpan . Milliseconds ) ) ;
127
120
}
128
121
else if ( token . StartsWith ( "[s" , StringComparison . OrdinalIgnoreCase ) )
129
122
{
130
123
var value = ( int ) timeSpan . TotalSeconds ;
131
124
var digits = token . Length - 2 ;
132
125
result . Append ( value . ToString ( "D" + digits ) ) ;
133
- timeSpan = TimeSpan . FromSeconds ( timeSpan . TotalSeconds - value ) ;
126
+ timeSpan = new TimeSpan ( 0 , 0 , 0 , 0 , Math . Abs ( timeSpan . Milliseconds ) ) ;
134
127
}
135
128
else if ( token . StartsWith ( ".0" ) ) {
136
- var value = GetRoundedMilliseconds ( timeSpan ) ;
129
+ var value = timeSpan . Milliseconds ;
137
130
var digits = token . Length - 1 ;
138
131
result . Append ( "." + value . ToString ( "D" + digits ) ) ;
139
132
}
@@ -146,17 +139,6 @@ private static string FormatTimeSpan(TimeSpan timeSpan, List<string> tokens, Cul
146
139
return result . ToString ( ) ;
147
140
}
148
141
149
- /// <summary>
150
- /// In .Net Core 3.0, TimeSpan is stored with microseconds. As a result, 31:44.500 may be presented as 31:44.499999,
151
- /// and TimeSpan.Microseconds will return 499 instead of 500. This method returns a number of microseconds rounded
152
- /// to a whole.
153
- /// </summary>
154
- private static int GetRoundedMilliseconds ( TimeSpan timeSpan )
155
- {
156
- var milliseconds = timeSpan . TotalMilliseconds - ( int ) timeSpan . TotalSeconds * 1000 ;
157
- return ( int ) Math . Round ( milliseconds ) ;
158
- }
159
-
160
142
private static string FormatDate ( DateTime date , List < string > tokens , CultureInfo culture )
161
143
{
162
144
var containsAmPm = ContainsAmPm ( tokens ) ;
0 commit comments