| 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 |