@@ -56,28 +56,31 @@ public static String formatDuration(long durationMillis, @NotNull String format)
56
56
*/
57
57
@ NotNull
58
58
public static String formatDuration (long durationMillis , @ NotNull String format , boolean padWithZeros ) {
59
+ // Get tokens
59
60
final char [] array = format .toCharArray ();
60
- final List <Token > list = new ArrayList <>(array .length );
61
-
61
+ final List <Token > tokens = new ArrayList <>(array .length );
62
62
boolean inLiteral = false ;
63
- StringBuilder lexxBuilder = null ;
63
+ StringBuilder literalBuilder = null ;
64
64
Token previous = null ;
65
- for (final char ch : array ) {
66
- if (inLiteral && ch != '\'' ) {
67
- lexxBuilder .append (ch );
65
+ for (final char character : array ) {
66
+ // Literal
67
+ if (inLiteral && character != '\'' ) {
68
+ literalBuilder .append (character );
68
69
continue ;
69
70
}
70
71
71
- switch (ch ) {
72
+ switch (character ) {
72
73
case '\'' :
74
+ // Literal
73
75
if (inLiteral ) {
74
- lexxBuilder = null ;
75
76
inLiteral = false ;
77
+ literalBuilder = null ;
76
78
} else {
77
- lexxBuilder = new StringBuilder ();
78
- list .add (new Token (lexxBuilder ));
79
79
inLiteral = true ;
80
+ literalBuilder = new StringBuilder ();
81
+ tokens .add (new Token (literalBuilder , true ));
80
82
}
83
+ previous = null ;
81
84
break ;
82
85
case 'y' :
83
86
case 'M' :
@@ -86,25 +89,30 @@ public static String formatDuration(long durationMillis, @NotNull String format,
86
89
case 'm' :
87
90
case 's' :
88
91
case 'S' :
89
- final String value = String .valueOf (ch );
92
+ literalBuilder = null ;
93
+
94
+ // Same as previous token, increment count
95
+ final String value = String .valueOf (character );
90
96
if (previous != null && previous .value .toString ().equals (value )) {
91
97
previous .count ++;
92
- } else {
93
- final Token token = new Token (new StringBuilder (value ));
94
- list .add (token );
95
- previous = token ;
98
+ break ;
96
99
}
97
- lexxBuilder = null ;
100
+
101
+ // New token
102
+ final Token token = new Token (new StringBuilder (value ), false );
103
+ tokens .add (token );
104
+ previous = token ;
98
105
break ;
99
106
default :
100
- if (lexxBuilder == null ) {
101
- lexxBuilder = new StringBuilder ();
102
- list .add (new Token (lexxBuilder ));
107
+ // Doesn't match any token, treat as literal
108
+ if (literalBuilder == null ) {
109
+ literalBuilder = new StringBuilder ();
110
+ tokens .add (new Token (literalBuilder , true ));
103
111
}
104
- lexxBuilder .append (ch );
112
+ literalBuilder .append (character );
113
+ previous = null ;
105
114
}
106
115
}
107
- final Token [] tokens = list .toArray (new Token [0 ]);
108
116
109
117
int years = 0 ;
110
118
int months = 0 ;
@@ -151,6 +159,13 @@ public static String formatDuration(long durationMillis, @NotNull String format,
151
159
boolean lastOutputSeconds = false ;
152
160
for (final Token token : tokens ) {
153
161
final String value = token .value .toString ();
162
+
163
+ // Literal
164
+ if (token .literal ) {
165
+ builder .append (value );
166
+ continue ;
167
+ }
168
+
154
169
final int count = token .count ;
155
170
switch (value ) {
156
171
case "y" :
@@ -212,14 +227,16 @@ private DurationFormatter() {
212
227
private static class Token {
213
228
@ NotNull private final StringBuilder value ;
214
229
private int count = 1 ;
230
+ private final boolean literal ;
215
231
216
232
/**
217
233
* Wraps a token around a value. A value would be something like a 'Y'
218
234
*
219
235
* @param value to wrap
220
236
*/
221
- private Token (@ NotNull StringBuilder value ) {
237
+ private Token (@ NotNull StringBuilder value , boolean literal ) {
222
238
this .value = value ;
239
+ this .literal = literal ;
223
240
}
224
241
225
242
/**
@@ -231,8 +248,8 @@ private Token(@NotNull StringBuilder value) {
231
248
* @return boolean <code>true</code> if contained
232
249
*/
233
250
@ Contract (pure = true )
234
- static boolean containsTokenWithValue (@ NotNull Token [] tokens , @ NotNull String value ) {
235
- for (final Token token : tokens ) if (token .value .toString ().equals (value )) return true ;
251
+ static boolean containsTokenWithValue (@ NotNull List < Token > tokens , @ NotNull String value ) {
252
+ for (final Token token : tokens ) if (! token . literal && token .value .toString ().equals (value )) return true ;
236
253
return false ;
237
254
}
238
255
}
0 commit comments