30
30
import java .util .Locale ;
31
31
32
32
public class DateFormatter {
33
- private static final char NUMBER_OF_DAYS_LETTER = 'b' ;
33
+ private static final char NUMBER_OF_DAYS_LOWER_LETTER = 'b' ;
34
+ private static final char NUMBER_OF_DAYS_UPPER_LETTER = 'B' ;
35
+
34
36
private final Context context ;
35
37
private final DateFormatValue dateFormatValue ;
36
38
private final DateTime now ;
@@ -59,10 +61,13 @@ public CharSequence formatDate(DateTime date) {
59
61
return formatDateTime (date , DateUtils .FORMAT_ABBREV_ALL | DateUtils .FORMAT_SHOW_DATE |
60
62
DateUtils .FORMAT_SHOW_WEEKDAY );
61
63
case DEFAULT_DAYS :
62
- return getNumberOfDaysToEventString (context , 5 , getNumberOfDaysToEvent (date )) + ", " +
64
+ return formatNumberOfDaysToEvent (context , 5 , getNumberOfDaysToEvent (date )) + ", " +
63
65
formatDateTime (date , DateUtils .FORMAT_SHOW_DATE );
66
+ case DEFAULT_YTT :
67
+ CharSequence str1 = formatNumberOfDaysToEventText (context , 3 , getNumberOfDaysToEvent (date ));
68
+ return (str1 .length () == 0 ? "" : str1 + ", " ) + formatDateTime (date , DateUtils .FORMAT_SHOW_DATE );
64
69
case NUMBER_OF_DAYS :
65
- return getNumberOfDaysToEventString (context , 5 , getNumberOfDaysToEvent (date ));
70
+ return formatNumberOfDaysToEvent (context , 5 , getNumberOfDaysToEvent (date ));
66
71
default :
67
72
return "(not implemented)" ;
68
73
}
@@ -86,18 +91,10 @@ public static Date toJavaDate(DateTime date) {
86
91
return new Date (date .getYearOfEra () - 1900 , date .getMonthOfYear () - 1 , date .getDayOfMonth ());
87
92
}
88
93
89
- public static CharSequence getNumberOfDaysToEventString (Context context , int formatLength , int daysToEvent ) {
94
+ public static CharSequence formatNumberOfDaysToEvent (Context context , int formatLength , int daysToEvent ) {
90
95
if (formatLength >= 4 ) {
91
- switch (daysToEvent ) {
92
- case -1 :
93
- return context .getText (R .string .yesterday );
94
- case 0 :
95
- return context .getText (R .string .today );
96
- case 1 :
97
- return context .getText (R .string .tomorrow );
98
- default :
99
- break ;
100
- }
96
+ CharSequence ytt = getYtt (context , daysToEvent );
97
+ if (ytt .length () > 0 ) return ytt ;
101
98
}
102
99
if (Math .abs (daysToEvent ) > 9999 ) return "..." ;
103
100
@@ -107,7 +104,30 @@ public static CharSequence getNumberOfDaysToEventString(Context context, int for
107
104
return String .format ("%0" + formatLength + "d" , daysToEvent );
108
105
}
109
106
110
- public int getNumberOfDaysToEvent (DateTime date ) {
107
+ public static CharSequence formatNumberOfDaysToEventText (Context context , int formatLength , int daysToEvent ) {
108
+ CharSequence ytt = getYtt (context , daysToEvent );
109
+ if (ytt .length () > 0 ) return ytt ;
110
+
111
+ if (formatLength < 4 ) return "" ;
112
+
113
+ return String .format (context .getText (daysToEvent < 0 ? R .string .N_days_ago : R .string .in_N_days ).toString (),
114
+ Math .abs (daysToEvent ));
115
+ }
116
+
117
+ public static CharSequence getYtt (Context context , int daysToEvent ) {
118
+ switch (daysToEvent ) {
119
+ case -1 :
120
+ return context .getText (R .string .yesterday );
121
+ case 0 :
122
+ return context .getText (R .string .today );
123
+ case 1 :
124
+ return context .getText (R .string .tomorrow );
125
+ default :
126
+ return "" ;
127
+ }
128
+ }
129
+
130
+ private int getNumberOfDaysToEvent (DateTime date ) {
111
131
return Days .daysBetween (
112
132
now .withZone (date .getZone ()).withTimeAtStartOfDay (),
113
133
date .withTimeAtStartOfDay ())
@@ -130,20 +150,24 @@ private String preProcessNumberOfDaysToEvent(DateTime date, String pattern) {
130
150
int ind1 = getIndexOfNumberOfDaysLetter (pattern );
131
151
if (ind1 < 0 ) return pattern ;
132
152
153
+ char patternLetter = pattern .charAt (ind1 );
133
154
int ind2 = ind1 ;
134
- while (ind2 < pattern .length () && pattern .charAt (ind2 ) == NUMBER_OF_DAYS_LETTER ) {
155
+ while (ind2 < pattern .length () && pattern .charAt (ind2 ) == patternLetter ) {
135
156
ind2 ++;
136
157
}
137
- CharSequence result = getNumberOfDaysToEventString (context , ind2 - ind1 , getNumberOfDaysToEvent (date ));
158
+ CharSequence result = patternLetter == NUMBER_OF_DAYS_LOWER_LETTER
159
+ ? formatNumberOfDaysToEvent (context , ind2 - ind1 , getNumberOfDaysToEvent (date ))
160
+ : formatNumberOfDaysToEventText (context , ind2 - ind1 , getNumberOfDaysToEvent (date ));
138
161
return (ind1 > 0 ? pattern .substring (0 , ind1 ) : "" ) +
139
- " '" + result + "'" +
140
- (ind2 < pattern .length () ? pattern .substring (ind2 ) : "" );
162
+ ( result . length () == 0 ? "" : " '" + result + "'" ) +
163
+ (ind2 < pattern .length () ? pattern .substring (ind2 ) : "" );
141
164
}
142
165
143
166
private int getIndexOfNumberOfDaysLetter (String pattern ) {
144
167
boolean inQuotes = false ;
145
168
for (int ind = 0 ; ind < pattern .length (); ind ++) {
146
- if ((pattern .charAt (ind ) == NUMBER_OF_DAYS_LETTER ) && !inQuotes ) return ind ;
169
+ if ((pattern .charAt (ind ) == NUMBER_OF_DAYS_LOWER_LETTER || pattern .charAt (ind ) == NUMBER_OF_DAYS_UPPER_LETTER )
170
+ && !inQuotes ) return ind ;
147
171
148
172
if (pattern .charAt (ind ) == '\'' ) inQuotes = !inQuotes ;
149
173
}
0 commit comments