OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of intl; | 5 part of intl; |
6 | 6 |
7 /** | 7 /** |
8 * This is a private class internal to DateFormat which is used for formatting | 8 * This is a private class internal to DateFormat which is used for formatting |
9 * particular fields in a template. e.g. if the format is hh:mm:ss then the | 9 * particular fields in a template. e.g. if the format is hh:mm:ss then the |
10 * fields would be "hh", ":", "mm", ":", and "ss". Each type of field knows | 10 * fields would be "hh", ":", "mm", ":", and "ss". Each type of field knows |
(...skipping 12 matching lines...) Expand all Loading... |
23 * Return the width of [pattern]. Different widths represent different | 23 * Return the width of [pattern]. Different widths represent different |
24 * formatting options. See the comment for DateFormat for details. | 24 * formatting options. See the comment for DateFormat for details. |
25 */ | 25 */ |
26 int get width => pattern.length; | 26 int get width => pattern.length; |
27 | 27 |
28 String fullPattern() => pattern; | 28 String fullPattern() => pattern; |
29 | 29 |
30 String toString() => pattern; | 30 String toString() => pattern; |
31 | 31 |
32 /** Format date according to our specification and return the result. */ | 32 /** Format date according to our specification and return the result. */ |
33 String format(Date date) { | 33 String format(DateTime date) { |
34 // Default implementation in the superclass, works for both types of | 34 // Default implementation in the superclass, works for both types of |
35 // literal patterns, and is overridden by _DateFormatPatternField. | 35 // literal patterns, and is overridden by _DateFormatPatternField. |
36 return pattern; | 36 return pattern; |
37 } | 37 } |
38 | 38 |
39 /** Abstract method for subclasses to implementing parsing for their format.*/ | 39 /** Abstract method for subclasses to implementing parsing for their format.*/ |
40 void parse(_Stream input, _DateBuilder dateFields); | 40 void parse(_Stream input, _DateBuilder dateFields); |
41 | 41 |
42 /** Parse a literal field. We just look for the exact input. */ | 42 /** Parse a literal field. We just look for the exact input. */ |
43 void parseLiteral(_Stream input) { | 43 void parseLiteral(_Stream input) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 /* | 101 /* |
102 * Represents a field in the pattern that formats some aspect of the | 102 * Represents a field in the pattern that formats some aspect of the |
103 * date. Consists primarily of a switch on the particular pattern characters | 103 * date. Consists primarily of a switch on the particular pattern characters |
104 * to determine what to do. | 104 * to determine what to do. |
105 */ | 105 */ |
106 class _DateFormatPatternField extends _DateFormatField { | 106 class _DateFormatPatternField extends _DateFormatField { |
107 | 107 |
108 _DateFormatPatternField(pattern, parent): super(pattern, parent); | 108 _DateFormatPatternField(pattern, parent): super(pattern, parent); |
109 | 109 |
110 /** Format date according to our specification and return the result. */ | 110 /** Format date according to our specification and return the result. */ |
111 String format(Date date) { | 111 String format(DateTime date) { |
112 return formatField(date); | 112 return formatField(date); |
113 } | 113 } |
114 | 114 |
115 /** | 115 /** |
116 * Parse the date according to our specification and put the result | 116 * Parse the date according to our specification and put the result |
117 * into the correct place in dateFields. | 117 * into the correct place in dateFields. |
118 */ | 118 */ |
119 void parse(_Stream input, _DateBuilder dateFields) { | 119 void parse(_Stream input, _DateBuilder dateFields) { |
120 parseField(input, dateFields); | 120 parseField(input, dateFields); |
121 } | 121 } |
(...skipping 23 matching lines...) Expand all Loading... |
145 case 'v': break; // time zone id | 145 case 'v': break; // time zone id |
146 case 'y': handleNumericField(input, builder.setYear); break; | 146 case 'y': handleNumericField(input, builder.setYear); break; |
147 case 'z': break; // time zone | 147 case 'z': break; // time zone |
148 case 'Z': break; // time zone RFC | 148 case 'Z': break; // time zone RFC |
149 default: return; | 149 default: return; |
150 } | 150 } |
151 } catch (e) { throwFormatException(input); } | 151 } catch (e) { throwFormatException(input); } |
152 } | 152 } |
153 | 153 |
154 /** Formatting logic if we are of type FIELD */ | 154 /** Formatting logic if we are of type FIELD */ |
155 String formatField(Date date) { | 155 String formatField(DateTime date) { |
156 switch (pattern[0]) { | 156 switch (pattern[0]) { |
157 case 'a': return formatAmPm(date); | 157 case 'a': return formatAmPm(date); |
158 case 'c': return formatStandaloneDay(date); | 158 case 'c': return formatStandaloneDay(date); |
159 case 'd': return formatDayOfMonth(date); | 159 case 'd': return formatDayOfMonth(date); |
160 case 'E': return formatDayOfWeek(date); | 160 case 'E': return formatDayOfWeek(date); |
161 case 'G': return formatEra(date); | 161 case 'G': return formatEra(date); |
162 case 'h': return format1To12Hours(date); | 162 case 'h': return format1To12Hours(date); |
163 case 'H': return format0To23Hours(date); | 163 case 'H': return format0To23Hours(date); |
164 case 'K': return format0To11Hours(date); | 164 case 'K': return format0To11Hours(date); |
165 case 'k': return format24Hours(date); | 165 case 'k': return format24Hours(date); |
166 case 'L': return formatStandaloneMonth(date); | 166 case 'L': return formatStandaloneMonth(date); |
167 case 'M': return formatMonth(date); | 167 case 'M': return formatMonth(date); |
168 case 'm': return formatMinutes(date); | 168 case 'm': return formatMinutes(date); |
169 case 'Q': return formatQuarter(date); | 169 case 'Q': return formatQuarter(date); |
170 case 'S': return formatFractionalSeconds(date); | 170 case 'S': return formatFractionalSeconds(date); |
171 case 's': return formatSeconds(date); | 171 case 's': return formatSeconds(date); |
172 case 'v': return formatTimeZoneId(date); | 172 case 'v': return formatTimeZoneId(date); |
173 case 'y': return formatYear(date); | 173 case 'y': return formatYear(date); |
174 case 'z': return formatTimeZone(date); | 174 case 'z': return formatTimeZone(date); |
175 case 'Z': return formatTimeZoneRFC(date); | 175 case 'Z': return formatTimeZoneRFC(date); |
176 default: return ''; | 176 default: return ''; |
177 } | 177 } |
178 } | 178 } |
179 | 179 |
180 /** Return the symbols for our current locale. */ | 180 /** Return the symbols for our current locale. */ |
181 DateSymbols get symbols => dateTimeSymbols[parent.locale]; | 181 DateSymbols get symbols => dateTimeSymbols[parent.locale]; |
182 | 182 |
183 formatEra(Date date) { | 183 formatEra(DateTime date) { |
184 var era = date.year > 0 ? 1 : 0; | 184 var era = date.year > 0 ? 1 : 0; |
185 return width >= 4 ? symbols.ERANAMES[era] : | 185 return width >= 4 ? symbols.ERANAMES[era] : |
186 symbols.ERAS[era]; | 186 symbols.ERAS[era]; |
187 } | 187 } |
188 | 188 |
189 formatYear(Date date) { | 189 formatYear(DateTime date) { |
190 // TODO(alanknight): Proper handling of years <= 0 | 190 // TODO(alanknight): Proper handling of years <= 0 |
191 var year = date.year; | 191 var year = date.year; |
192 if (year < 0) { | 192 if (year < 0) { |
193 year = -year; | 193 year = -year; |
194 } | 194 } |
195 return width == 2 ? padTo(2, year % 100) : year.toString(); | 195 return width == 2 ? padTo(2, year % 100) : year.toString(); |
196 } | 196 } |
197 | 197 |
198 /** | 198 /** |
199 * We are given [input] as a stream from which we want to read a date. We | 199 * We are given [input] as a stream from which we want to read a date. We |
(...skipping 22 matching lines...) Expand all Loading... |
222 var results = new _Stream(possibilities).findIndexes( | 222 var results = new _Stream(possibilities).findIndexes( |
223 (each) => input.peek(each.length) == each); | 223 (each) => input.peek(each.length) == each); |
224 if (results.isEmpty) throwFormatException(input); | 224 if (results.isEmpty) throwFormatException(input); |
225 results.sort( | 225 results.sort( |
226 (a, b) => possibilities[a].length.compareTo(possibilities[b].length)); | 226 (a, b) => possibilities[a].length.compareTo(possibilities[b].length)); |
227 var longestResult = results.last; | 227 var longestResult = results.last; |
228 input.read(possibilities[longestResult].length); | 228 input.read(possibilities[longestResult].length); |
229 return longestResult; | 229 return longestResult; |
230 } | 230 } |
231 | 231 |
232 String formatMonth(Date date) { | 232 String formatMonth(DateTime date) { |
233 switch (width) { | 233 switch (width) { |
234 case 5: return symbols.NARROWMONTHS[date.month-1]; | 234 case 5: return symbols.NARROWMONTHS[date.month-1]; |
235 case 4: return symbols.MONTHS[date.month-1]; | 235 case 4: return symbols.MONTHS[date.month-1]; |
236 case 3: return symbols.SHORTMONTHS[date.month-1]; | 236 case 3: return symbols.SHORTMONTHS[date.month-1]; |
237 default: | 237 default: |
238 return padTo(width, date.month); | 238 return padTo(width, date.month); |
239 } | 239 } |
240 } | 240 } |
241 | 241 |
242 void parseMonth(input, dateFields) { | 242 void parseMonth(input, dateFields) { |
243 var possibilities; | 243 var possibilities; |
244 switch(width) { | 244 switch(width) { |
245 case 5: possibilities = symbols.NARROWMONTHS; break; | 245 case 5: possibilities = symbols.NARROWMONTHS; break; |
246 case 4: possibilities = symbols.MONTHS; break; | 246 case 4: possibilities = symbols.MONTHS; break; |
247 case 3: possibilities = symbols.SHORTMONTHS; break; | 247 case 3: possibilities = symbols.SHORTMONTHS; break; |
248 default: return handleNumericField(input, dateFields.setMonth); | 248 default: return handleNumericField(input, dateFields.setMonth); |
249 } | 249 } |
250 dateFields.month = parseEnumeratedString(input, possibilities) + 1; | 250 dateFields.month = parseEnumeratedString(input, possibilities) + 1; |
251 } | 251 } |
252 | 252 |
253 String format24Hours(Date date) { | 253 String format24Hours(DateTime date) { |
254 return padTo(width, date.hour); | 254 return padTo(width, date.hour); |
255 } | 255 } |
256 | 256 |
257 String formatFractionalSeconds(Date date) { | 257 String formatFractionalSeconds(DateTime date) { |
258 // Always print at least 3 digits. If the width is greater, append 0s | 258 // Always print at least 3 digits. If the width is greater, append 0s |
259 var basic = padTo(3, date.millisecond); | 259 var basic = padTo(3, date.millisecond); |
260 if (width - 3 > 0) { | 260 if (width - 3 > 0) { |
261 var extra = padTo(width - 3, 0); | 261 var extra = padTo(width - 3, 0); |
262 return basic.concat(extra); | 262 return basic.concat(extra); |
263 } else { | 263 } else { |
264 return basic; | 264 return basic; |
265 } | 265 } |
266 } | 266 } |
267 | 267 |
268 String formatAmPm(Date date) { | 268 String formatAmPm(DateTime date) { |
269 var hours = date.hour; | 269 var hours = date.hour; |
270 var index = (date.hour >= 12) && (date.hour < 24) ? 1 : 0; | 270 var index = (date.hour >= 12) && (date.hour < 24) ? 1 : 0; |
271 var ampm = symbols.AMPMS; | 271 var ampm = symbols.AMPMS; |
272 return ampm[index]; | 272 return ampm[index]; |
273 } | 273 } |
274 | 274 |
275 void parseAmPm(input, dateFields) { | 275 void parseAmPm(input, dateFields) { |
276 // If we see a "PM" note it in an extra field. | 276 // If we see a "PM" note it in an extra field. |
277 var ampm = parseEnumeratedString(input, symbols.AMPMS); | 277 var ampm = parseEnumeratedString(input, symbols.AMPMS); |
278 if (ampm == 1) dateFields.pm = true; | 278 if (ampm == 1) dateFields.pm = true; |
279 } | 279 } |
280 | 280 |
281 String format1To12Hours(Date date) { | 281 String format1To12Hours(DateTime date) { |
282 var hours = date.hour; | 282 var hours = date.hour; |
283 if (date.hour > 12) hours = hours - 12; | 283 if (date.hour > 12) hours = hours - 12; |
284 if (hours == 0) hours = 12; | 284 if (hours == 0) hours = 12; |
285 return padTo(width, hours); | 285 return padTo(width, hours); |
286 } | 286 } |
287 | 287 |
288 void parse1To12Hours(_Stream input, _DateBuilder dateFields) { | 288 void parse1To12Hours(_Stream input, _DateBuilder dateFields) { |
289 handleNumericField(input, dateFields.setHour); | 289 handleNumericField(input, dateFields.setHour); |
290 if (dateFields.hour == 12) dateFields.hour = 0; | 290 if (dateFields.hour == 12) dateFields.hour = 0; |
291 } | 291 } |
292 | 292 |
293 String format0To11Hours(Date date) { | 293 String format0To11Hours(DateTime date) { |
294 return padTo(width, date.hour % 12); | 294 return padTo(width, date.hour % 12); |
295 } | 295 } |
296 | 296 |
297 String format0To23Hours(Date date) { | 297 String format0To23Hours(DateTime date) { |
298 return padTo(width, date.hour); | 298 return padTo(width, date.hour); |
299 } | 299 } |
300 | 300 |
301 String formatStandaloneDay(Date date) { | 301 String formatStandaloneDay(DateTime date) { |
302 switch (width) { | 302 switch (width) { |
303 case 5: return symbols.STANDALONENARROWWEEKDAYS[date.weekday % 7]; | 303 case 5: return symbols.STANDALONENARROWWEEKDAYS[date.weekday % 7]; |
304 case 4: return symbols.STANDALONEWEEKDAYS[date.weekday % 7]; | 304 case 4: return symbols.STANDALONEWEEKDAYS[date.weekday % 7]; |
305 case 3: return symbols.STANDALONESHORTWEEKDAYS[date.weekday % 7]; | 305 case 3: return symbols.STANDALONESHORTWEEKDAYS[date.weekday % 7]; |
306 default: | 306 default: |
307 return padTo(1, date.day); | 307 return padTo(1, date.day); |
308 } | 308 } |
309 } | 309 } |
310 | 310 |
311 void parseStandaloneDay(_Stream input) { | 311 void parseStandaloneDay(_Stream input) { |
312 // This is ignored, but we still have to skip over it the correct amount. | 312 // This is ignored, but we still have to skip over it the correct amount. |
313 var possibilities; | 313 var possibilities; |
314 switch(width) { | 314 switch(width) { |
315 case 5: possibilities = symbols.STANDALONENARROWWEEKDAYS; break; | 315 case 5: possibilities = symbols.STANDALONENARROWWEEKDAYS; break; |
316 case 4: possibilities = symbols.STANDALONEWEEKDAYS; break; | 316 case 4: possibilities = symbols.STANDALONEWEEKDAYS; break; |
317 case 3: possibilities = symbols.STANDALONESHORTWEEKDAYS; break; | 317 case 3: possibilities = symbols.STANDALONESHORTWEEKDAYS; break; |
318 default: return handleNumericField(input, (x)=>x); | 318 default: return handleNumericField(input, (x)=>x); |
319 } | 319 } |
320 parseEnumeratedString(input, possibilities); | 320 parseEnumeratedString(input, possibilities); |
321 } | 321 } |
322 | 322 |
323 String formatStandaloneMonth(Date date) { | 323 String formatStandaloneMonth(DateTime date) { |
324 switch (width) { | 324 switch (width) { |
325 case 5: | 325 case 5: |
326 return symbols.STANDALONENARROWMONTHS[date.month-1]; | 326 return symbols.STANDALONENARROWMONTHS[date.month-1]; |
327 case 4: | 327 case 4: |
328 return symbols.STANDALONEMONTHS[date.month-1]; | 328 return symbols.STANDALONEMONTHS[date.month-1]; |
329 case 3: | 329 case 3: |
330 return symbols.STANDALONESHORTMONTHS[date.month-1]; | 330 return symbols.STANDALONESHORTMONTHS[date.month-1]; |
331 default: | 331 default: |
332 return padTo(width, date.month); | 332 return padTo(width, date.month); |
333 } | 333 } |
334 } | 334 } |
335 | 335 |
336 void parseStandaloneMonth(input, dateFields) { | 336 void parseStandaloneMonth(input, dateFields) { |
337 var possibilities; | 337 var possibilities; |
338 switch(width) { | 338 switch(width) { |
339 case 5: possibilities = symbols.STANDALONENARROWMONTHS; break; | 339 case 5: possibilities = symbols.STANDALONENARROWMONTHS; break; |
340 case 4: possibilities = symbols.STANDALONEMONTHS; break; | 340 case 4: possibilities = symbols.STANDALONEMONTHS; break; |
341 case 3: possibilities = symbols.STANDALONESHORTMONTHS; break; | 341 case 3: possibilities = symbols.STANDALONESHORTMONTHS; break; |
342 default: return handleNumericField(input, dateFields.setMonth); | 342 default: return handleNumericField(input, dateFields.setMonth); |
343 } | 343 } |
344 dateFields.month = parseEnumeratedString(input, possibilities) + 1; | 344 dateFields.month = parseEnumeratedString(input, possibilities) + 1; |
345 } | 345 } |
346 | 346 |
347 String formatQuarter(Date date) { | 347 String formatQuarter(DateTime date) { |
348 var quarter = (date.month / 3).truncate().toInt(); | 348 var quarter = (date.month / 3).truncate().toInt(); |
349 if (width < 4) { | 349 if (width < 4) { |
350 return symbols.SHORTQUARTERS[quarter]; | 350 return symbols.SHORTQUARTERS[quarter]; |
351 } else { | 351 } else { |
352 return symbols.QUARTERS[quarter]; | 352 return symbols.QUARTERS[quarter]; |
353 } | 353 } |
354 } | 354 } |
355 String formatDayOfMonth(Date date) { | 355 String formatDayOfMonth(DateTime date) { |
356 return padTo(width, date.day); | 356 return padTo(width, date.day); |
357 } | 357 } |
358 | 358 |
359 String formatDayOfWeek(Date date) { | 359 String formatDayOfWeek(DateTime date) { |
360 // Note that Dart's weekday returns 1 for Monday and 7 for Sunday. | 360 // Note that Dart's weekday returns 1 for Monday and 7 for Sunday. |
361 return (width >= 4 ? symbols.WEEKDAYS : | 361 return (width >= 4 ? symbols.WEEKDAYS : |
362 symbols.SHORTWEEKDAYS)[(date.weekday) % 7]; | 362 symbols.SHORTWEEKDAYS)[(date.weekday) % 7]; |
363 } | 363 } |
364 | 364 |
365 void parseDayOfWeek(_Stream input) { | 365 void parseDayOfWeek(_Stream input) { |
366 // This is IGNORED, but we still have to skip over it the correct amount. | 366 // This is IGNORED, but we still have to skip over it the correct amount. |
367 var possibilities = width >= 4 ? symbols.WEEKDAYS : symbols.SHORTWEEKDAYS; | 367 var possibilities = width >= 4 ? symbols.WEEKDAYS : symbols.SHORTWEEKDAYS; |
368 parseEnumeratedString(input, possibilities); | 368 parseEnumeratedString(input, possibilities); |
369 } | 369 } |
370 | 370 |
371 String formatMinutes(Date date) { | 371 String formatMinutes(DateTime date) { |
372 return padTo(width, date.minute); | 372 return padTo(width, date.minute); |
373 } | 373 } |
374 | 374 |
375 String formatSeconds(Date date) { | 375 String formatSeconds(DateTime date) { |
376 return padTo(width, date.second); | 376 return padTo(width, date.second); |
377 } | 377 } |
378 | 378 |
379 String formatTimeZoneId(Date date) { | 379 String formatTimeZoneId(DateTime date) { |
380 // TODO(alanknight): implement time zone support | 380 // TODO(alanknight): implement time zone support |
381 throw new UnimplementedError(); | 381 throw new UnimplementedError(); |
382 } | 382 } |
383 | 383 |
384 String formatTimeZone(Date date) { | 384 String formatTimeZone(DateTime date) { |
385 throw new UnimplementedError(); | 385 throw new UnimplementedError(); |
386 } | 386 } |
387 | 387 |
388 String formatTimeZoneRFC(Date date) { | 388 String formatTimeZoneRFC(DateTime date) { |
389 throw new UnimplementedError(); | 389 throw new UnimplementedError(); |
390 } | 390 } |
391 | 391 |
392 /** | 392 /** |
393 * Return a string representation of the object padded to the left with | 393 * Return a string representation of the object padded to the left with |
394 * zeros. Primarily useful for numbers. | 394 * zeros. Primarily useful for numbers. |
395 */ | 395 */ |
396 String padTo(int width, Object toBePrinted) { | 396 String padTo(int width, Object toBePrinted) { |
397 var basicString = toBePrinted.toString(); | 397 var basicString = toBePrinted.toString(); |
398 if (basicString.length >= width) return basicString; | 398 if (basicString.length >= width) return basicString; |
399 var buffer = new StringBuffer(); | 399 var buffer = new StringBuffer(); |
400 for (var i = 0; i < width - basicString.length; i++) { | 400 for (var i = 0; i < width - basicString.length; i++) { |
401 buffer.add('0'); | 401 buffer.add('0'); |
402 } | 402 } |
403 buffer.add(basicString); | 403 buffer.add(basicString); |
404 return buffer.toString(); | 404 return buffer.toString(); |
405 } | 405 } |
406 } | 406 } |
OLD | NEW |