@@ -207,52 +207,40 @@ public bool IsEmpty()
207207
208208 public class LyricTimestamp : IComparable
209209 {
210- public long Minute { get ; }
211-
212- public long Second { get ; }
213-
214- public long Millisecond { get ; }
215-
216210 public long TimeOffset { get ; }
217211
218212 public LyricTimestamp ( long millisecond )
219213 {
220214 TimeOffset = millisecond ;
221-
222- Millisecond = millisecond % 1000 ;
223-
224- millisecond /= 1000 ;
225-
226- Second = millisecond % 60 ;
227-
228- Minute = millisecond / 60 ;
229215 }
230216
231217 public LyricTimestamp ( string timestamp )
232218 {
233219 if ( string . IsNullOrWhiteSpace ( timestamp ) || timestamp [ 0 ] != '[' || timestamp [ timestamp . Length - 1 ] != ']' )
234220 {
235221 // 不支持的格式
222+ TimeOffset = 0 ;
236223 }
237224 else
238225 {
239226 timestamp = timestamp . Substring ( 1 , timestamp . Length - 2 ) ;
240227
241228 var split = timestamp . Split ( ':' ) ;
242229
243- Minute = GlobalUtils . toInt ( split [ 0 ] , 0 ) ;
230+ var minute = GlobalUtils . toInt ( split [ 0 ] , 0 ) ;
244231
245232 split = split [ 1 ] . Split ( '.' ) ;
246233
247- Second = GlobalUtils . toInt ( split [ 0 ] , 0 ) ;
234+ var second = GlobalUtils . toInt ( split [ 0 ] , 0 ) ;
235+
236+ TimeOffset = ( minute * 60 + second ) * 1000 ;
248237
249238 if ( split . Length > 1 )
250239 {
251- Millisecond = GlobalUtils . toInt ( split [ 1 ] , 0 ) ;
240+ // 三位毫秒,右填充 0
241+ TimeOffset += GlobalUtils . toInt ( split [ 1 ] . PadRight ( 3 , '0' ) , 0 ) ;
252242 }
253243 }
254-
255- TimeOffset = ( Minute * 60 + Second ) * 1000 + Millisecond ;
256244 }
257245
258246 public int CompareTo ( object input )
@@ -287,20 +275,58 @@ public int CompareTo(object input)
287275 }
288276 }
289277
290- public string PrintTimestamp ( string timestampFormat , DotTypeEnum dotTypeEnum )
278+ public string PrintTimestamp ( string timestampFormat , DotTypeEnum dotType )
291279 {
292280 var output = timestampFormat ;
293281
282+ int msDigit ;
283+ if ( output . Contains ( "SSS" ) )
284+ {
285+ msDigit = 3 ;
286+ } else if ( output . Contains ( "SS" ) )
287+ {
288+ msDigit = 2 ;
289+ } else if ( output . Contains ( "S" ) )
290+ {
291+ msDigit = 1 ;
292+ }
293+ else
294+ {
295+ msDigit = 3 ;
296+ }
297+
298+ long offset ;
299+ if ( msDigit == 3 )
300+ {
301+ offset = TimeOffset ;
302+ }
303+ else
304+ {
305+ if ( dotType == DotTypeEnum . DOWN )
306+ {
307+ offset = TimeOffset / 10 * 10 ;
308+ }
309+ else
310+ {
311+ offset = ( TimeOffset + 5 ) / 10 * 10 ;
312+ }
313+ }
314+
315+ var ms = offset % 1000 ;
316+ offset /= 1000 ;
317+ var minute = offset / 60 ;
318+ var second = offset - minute * 60 ;
319+
294320 long actualMinute ;
295321 if ( output . Contains ( "HH" ) )
296322 {
297- var hour = Minute / 60 ;
298- actualMinute = Minute % 60 ;
323+ var hour = minute / 60 ;
324+ actualMinute = minute % 60 ;
299325 output = output . Replace ( "HH" , hour . ToString ( "00" ) ) ;
300326 }
301327 else
302328 {
303- actualMinute = Minute ;
329+ actualMinute = minute ;
304330 }
305331
306332 if ( output . Contains ( "mm" ) )
@@ -310,61 +336,26 @@ public string PrintTimestamp(string timestampFormat, DotTypeEnum dotTypeEnum)
310336
311337 if ( output . Contains ( "ss" ) )
312338 {
313- output = output . Replace ( "ss" , Second . ToString ( "00" ) ) ;
339+ output = output . Replace ( "ss" , second . ToString ( "00" ) ) ;
314340 }
315-
341+
316342 if ( output . Contains ( "SSS" ) )
317343 {
318- output = output . Replace ( "SSS" , Millisecond . ToString ( "000" ) ) ;
344+ output = output . Replace ( "SSS" , ms . ToString ( "000" ) ) ;
319345 }
320346
321347 if ( output . Contains ( "SS" ) )
322348 {
323- var actualMillisecond = AdjustMillisecondScale ( 2 , dotTypeEnum ) ;
324- output = output . Replace ( "SS" , actualMillisecond . ToString ( "00" ) ) ;
349+ output = output . Replace ( "SS" , ( ms / 10 ) . ToString ( "00" ) ) ;
325350 }
326351
327352 if ( output . Contains ( "S" ) )
328353 {
329- var actualMillisecond = AdjustMillisecondScale ( 1 , dotTypeEnum ) ;
330- output = output . Replace ( "S" , actualMillisecond . ToString ( "0" ) ) ;
354+ output = output . Replace ( "S" , ( ms / 100 ) . ToString ( "0" ) ) ;
331355 }
332356
333357 return output ;
334358 }
335-
336- /// <summary>
337- /// 调整毫秒位数
338- /// </summary>
339- /// <param name="scale">位数,取值为 1 ~ 3</param>
340- /// <param name="dotTypeEnum">截位规则</param>
341- /// <returns></returns>
342- private long AdjustMillisecondScale ( int scale , DotTypeEnum dotTypeEnum )
343- {
344- var limit = 1 ;
345- for ( var i = 0 ; i < scale ; i ++ )
346- {
347- limit *= 10 ;
348- }
349-
350- var actualMillisecond = Millisecond ;
351-
352- while ( actualMillisecond >= limit )
353- {
354- var round = 0 ;
355- if ( dotTypeEnum == DotTypeEnum . HALF_UP )
356- {
357- if ( actualMillisecond % 10 >= 5 )
358- {
359- round = 1 ;
360- }
361- }
362-
363- actualMillisecond = actualMillisecond / 10 + round ;
364- }
365-
366- return actualMillisecond ;
367- }
368359 }
369360
370361 /// <summary>
0 commit comments