OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 dart.core; | 5 part of dart.core; |
6 | 6 |
7 /** | 7 /** |
8 * An instant in time, such as July 20, 1969, 8:18pm GMT. | 8 * An instant in time, such as July 20, 1969, 8:18pm GMT. |
9 * | 9 * |
10 * Create a DateTime object by using one of the constructors | 10 * Create a DateTime object by using one of the constructors |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 | 148 |
149 /** | 149 /** |
150 * Constructs a [DateTime] instance specified in the local time zone. | 150 * Constructs a [DateTime] instance specified in the local time zone. |
151 * | 151 * |
152 * For example, | 152 * For example, |
153 * to create a new DateTime object representing April 29, 2014, 6:04am: | 153 * to create a new DateTime object representing April 29, 2014, 6:04am: |
154 * | 154 * |
155 * DateTime annularEclipse = new DateTime(2014, DateTime.APRIL, 29, 6, 4); | 155 * DateTime annularEclipse = new DateTime(2014, DateTime.APRIL, 29, 6, 4); |
156 */ | 156 */ |
157 DateTime(int year, | 157 DateTime(int year, |
158 [int month = 1, | 158 [int month = 1, |
159 int day = 1, | 159 int day = 1, |
160 int hour = 0, | 160 int hour = 0, |
161 int minute = 0, | 161 int minute = 0, |
162 int second = 0, | 162 int second = 0, |
163 int millisecond = 0, | 163 int millisecond = 0, |
164 int microsecond = 0]) | 164 int microsecond = 0]) |
165 : this._internal( | 165 : this._internal(year, month, day, hour, minute, second, millisecond, |
166 year, month, day, hour, minute, second, millisecond, microsecond, | 166 microsecond, false); |
167 false); | |
168 | 167 |
169 /** | 168 /** |
170 * Constructs a [DateTime] instance specified in the UTC time zone. | 169 * Constructs a [DateTime] instance specified in the UTC time zone. |
171 * | 170 * |
172 * DateTime dDay = new DateTime.utc(1944, DateTime.JUNE, 6); | 171 * DateTime dDay = new DateTime.utc(1944, DateTime.JUNE, 6); |
173 */ | 172 */ |
174 DateTime.utc(int year, | 173 DateTime.utc(int year, |
175 [int month = 1, | 174 [int month = 1, |
176 int day = 1, | 175 int day = 1, |
177 int hour = 0, | 176 int hour = 0, |
178 int minute = 0, | 177 int minute = 0, |
179 int second = 0, | 178 int second = 0, |
180 int millisecond = 0, | 179 int millisecond = 0, |
181 int microsecond = 0]) | 180 int microsecond = 0]) |
182 : this._internal( | 181 : this._internal(year, month, day, hour, minute, second, millisecond, |
183 year, month, day, hour, minute, second, millisecond, microsecond, | 182 microsecond, true); |
184 true); | |
185 | 183 |
186 /** | 184 /** |
187 * Constructs a [DateTime] instance with current date and time in the | 185 * Constructs a [DateTime] instance with current date and time in the |
188 * local time zone. | 186 * local time zone. |
189 * | 187 * |
190 * DateTime thisInstant = new DateTime.now(); | 188 * DateTime thisInstant = new DateTime.now(); |
191 * | 189 * |
192 */ | 190 */ |
193 DateTime.now() : this._now(); | 191 DateTime.now() : this._now(); |
194 | 192 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 * day ::= digit{2} | 254 * day ::= digit{2} |
257 * time_opt ::= <empty> | (' ' | 'T') hour minutes_opt | 255 * time_opt ::= <empty> | (' ' | 'T') hour minutes_opt |
258 * minutes_opt ::= <empty> | colon_opt digit{2} seconds_opt | 256 * minutes_opt ::= <empty> | colon_opt digit{2} seconds_opt |
259 * seconds_opt ::= <empty> | colon_opt digit{2} millis_opt | 257 * seconds_opt ::= <empty> | colon_opt digit{2} millis_opt |
260 * micros_opt ::= <empty> | '.' digit{1,6} | 258 * micros_opt ::= <empty> | '.' digit{1,6} |
261 * timezone_opt ::= <empty> | space_opt timezone | 259 * timezone_opt ::= <empty> | space_opt timezone |
262 * space_opt :: ' ' | <empty> | 260 * space_opt :: ' ' | <empty> |
263 * timezone ::= 'z' | 'Z' | sign digit{2} timezonemins_opt | 261 * timezone ::= 'z' | 'Z' | sign digit{2} timezonemins_opt |
264 * timezonemins_opt ::= <empty> | colon_opt digit{2} | 262 * timezonemins_opt ::= <empty> | colon_opt digit{2} |
265 */ | 263 */ |
266 final RegExp re = new RegExp( | 264 final RegExp re = new RegExp(r'^([+-]?\d{4,6})-?(\d\d)-?(\d\d)' // Day part. |
267 r'^([+-]?\d{4,6})-?(\d\d)-?(\d\d)' // Day part. | |
268 r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d{1,6}))?)?)?' // Time part. | 265 r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d{1,6}))?)?)?' // Time part. |
269 r'( ?[zZ]| ?([-+])(\d\d)(?::?(\d\d))?)?)?$'); // Timezone part. | 266 r'( ?[zZ]| ?([-+])(\d\d)(?::?(\d\d))?)?)?$'); // Timezone part. |
270 | 267 |
271 Match match = re.firstMatch(formattedString); | 268 Match match = re.firstMatch(formattedString); |
272 if (match != null) { | 269 if (match != null) { |
273 int parseIntOrZero(String matched) { | 270 int parseIntOrZero(String matched) { |
274 if (matched == null) return 0; | 271 if (matched == null) return 0; |
275 return int.parse(matched); | 272 return int.parse(matched); |
276 } | 273 } |
277 | 274 |
(...skipping 21 matching lines...) Expand all Loading... |
299 int hour = parseIntOrZero(match[4]); | 296 int hour = parseIntOrZero(match[4]); |
300 int minute = parseIntOrZero(match[5]); | 297 int minute = parseIntOrZero(match[5]); |
301 int second = parseIntOrZero(match[6]); | 298 int second = parseIntOrZero(match[6]); |
302 bool addOneMillisecond = false; | 299 bool addOneMillisecond = false; |
303 int milliAndMicroseconds = parseMilliAndMicroseconds(match[7]); | 300 int milliAndMicroseconds = parseMilliAndMicroseconds(match[7]); |
304 int millisecond = | 301 int millisecond = |
305 milliAndMicroseconds ~/ Duration.MICROSECONDS_PER_MILLISECOND; | 302 milliAndMicroseconds ~/ Duration.MICROSECONDS_PER_MILLISECOND; |
306 int microsecond = | 303 int microsecond = |
307 milliAndMicroseconds.remainder(Duration.MICROSECONDS_PER_MILLISECOND); | 304 milliAndMicroseconds.remainder(Duration.MICROSECONDS_PER_MILLISECOND); |
308 bool isUtc = false; | 305 bool isUtc = false; |
309 if (match[8] != null) { // timezone part | 306 if (match[8] != null) { |
| 307 // timezone part |
310 isUtc = true; | 308 isUtc = true; |
311 if (match[9] != null) { | 309 if (match[9] != null) { |
312 // timezone other than 'Z' and 'z'. | 310 // timezone other than 'Z' and 'z'. |
313 int sign = (match[9] == '-') ? -1 : 1; | 311 int sign = (match[9] == '-') ? -1 : 1; |
314 int hourDifference = int.parse(match[10]); | 312 int hourDifference = int.parse(match[10]); |
315 int minuteDifference = parseIntOrZero(match[11]); | 313 int minuteDifference = parseIntOrZero(match[11]); |
316 minuteDifference += 60 * hourDifference; | 314 minuteDifference += 60 * hourDifference; |
317 minute -= sign * minuteDifference; | 315 minute -= sign * minuteDifference; |
318 } | 316 } |
319 } | 317 } |
320 int value = _brokenDownDateToValue( | 318 int value = _brokenDownDateToValue(years, month, day, hour, minute, |
321 years, month, day, hour, minute, second, millisecond, microsecond, | 319 second, millisecond, microsecond, isUtc); |
322 isUtc); | |
323 if (value == null) { | 320 if (value == null) { |
324 throw new FormatException("Time out of range", formattedString); | 321 throw new FormatException("Time out of range", formattedString); |
325 } | 322 } |
326 return new DateTime._withValue(value, isUtc: isUtc); | 323 return new DateTime._withValue(value, isUtc: isUtc); |
327 } else { | 324 } else { |
328 throw new FormatException("Invalid date format", formattedString); | 325 throw new FormatException("Invalid date format", formattedString); |
329 } | 326 } |
330 } | 327 } |
331 | 328 |
332 static const int _MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000; | 329 static const int _MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000; |
333 | 330 |
334 /** | 331 /** |
335 * Constructs a new [DateTime] instance | 332 * Constructs a new [DateTime] instance |
336 * with the given [millisecondsSinceEpoch]. | 333 * with the given [millisecondsSinceEpoch]. |
337 * | 334 * |
338 * If [isUtc] is false then the date is in the local time zone. | 335 * If [isUtc] is false then the date is in the local time zone. |
339 * | 336 * |
340 * The constructed [DateTime] represents | 337 * The constructed [DateTime] represents |
341 * 1970-01-01T00:00:00Z + [millisecondsSinceEpoch] ms in the given | 338 * 1970-01-01T00:00:00Z + [millisecondsSinceEpoch] ms in the given |
342 * time zone (local or UTC). | 339 * time zone (local or UTC). |
343 */ | 340 */ |
344 external DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch, | 341 external DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch, |
345 {bool isUtc: false}); | 342 {bool isUtc: false}); |
346 | 343 |
347 /** | 344 /** |
348 * Constructs a new [DateTime] instance | 345 * Constructs a new [DateTime] instance |
349 * with the given [microsecondsSinceEpoch]. | 346 * with the given [microsecondsSinceEpoch]. |
350 * | 347 * |
351 * If [isUtc] is false then the date is in the local time zone. | 348 * If [isUtc] is false then the date is in the local time zone. |
352 * | 349 * |
353 * The constructed [DateTime] represents | 350 * The constructed [DateTime] represents |
354 * 1970-01-01T00:00:00Z + [microsecondsSinceEpoch] us in the given | 351 * 1970-01-01T00:00:00Z + [microsecondsSinceEpoch] us in the given |
355 * time zone (local or UTC). | 352 * time zone (local or UTC). |
356 */ | 353 */ |
357 external DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch, | 354 external DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch, |
358 {bool isUtc: false}); | 355 {bool isUtc: false}); |
359 | 356 |
360 /** | 357 /** |
361 * Constructs a new [DateTime] instance with the given value. | 358 * Constructs a new [DateTime] instance with the given value. |
362 * | 359 * |
363 * If [isUtc] is false then the date is in the local time zone. | 360 * If [isUtc] is false then the date is in the local time zone. |
364 */ | 361 */ |
365 DateTime._withValue(this._value, {this.isUtc}) { | 362 DateTime._withValue(this._value, {this.isUtc}) { |
366 if (millisecondsSinceEpoch.abs() > _MAX_MILLISECONDS_SINCE_EPOCH || | 363 if (millisecondsSinceEpoch.abs() > _MAX_MILLISECONDS_SINCE_EPOCH || |
367 (millisecondsSinceEpoch.abs() == _MAX_MILLISECONDS_SINCE_EPOCH && | 364 (millisecondsSinceEpoch.abs() == _MAX_MILLISECONDS_SINCE_EPOCH && |
368 microsecond != 0)) { | 365 microsecond != 0)) { |
369 throw new ArgumentError(millisecondsSinceEpoch); | 366 throw new ArgumentError(millisecondsSinceEpoch); |
370 } | 367 } |
371 if (isUtc == null) throw new ArgumentError(isUtc); | 368 if (isUtc == null) throw new ArgumentError(isUtc); |
372 } | 369 } |
373 | 370 |
374 /** | 371 /** |
375 * Returns true if [other] is a [DateTime] at the same moment and in the | 372 * Returns true if [other] is a [DateTime] at the same moment and in the |
376 * same time zone (UTC or local). | 373 * same time zone (UTC or local). |
377 * | 374 * |
378 * DateTime dDayUtc = new DateTime.utc(1944, DateTime.JUNE, 6); | 375 * DateTime dDayUtc = new DateTime.utc(1944, DateTime.JUNE, 6); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 * * `HH` are hours in the range 00 to 23, | 543 * * `HH` are hours in the range 00 to 23, |
547 * * `mm` are minutes in the range 00 to 59, | 544 * * `mm` are minutes in the range 00 to 59, |
548 * * `ss` are seconds in the range 00 to 59 (no leap seconds), | 545 * * `ss` are seconds in the range 00 to 59 (no leap seconds), |
549 * * `mmm` are milliseconds in the range 000 to 999, and | 546 * * `mmm` are milliseconds in the range 000 to 999, and |
550 * * `uuu` are microseconds in the range 001 to 999. If [microsecond] equals | 547 * * `uuu` are microseconds in the range 001 to 999. If [microsecond] equals |
551 * 0, then this part is omitted. | 548 * 0, then this part is omitted. |
552 * | 549 * |
553 * The resulting string can be parsed back using [parse]. | 550 * The resulting string can be parsed back using [parse]. |
554 */ | 551 */ |
555 String toIso8601String() { | 552 String toIso8601String() { |
556 String y = (year >= -9999 && year <= 9999) ? _fourDigits(year) | 553 String y = |
557 : _sixDigits(year); | 554 (year >= -9999 && year <= 9999) ? _fourDigits(year) : _sixDigits(year); |
558 String m = _twoDigits(month); | 555 String m = _twoDigits(month); |
559 String d = _twoDigits(day); | 556 String d = _twoDigits(day); |
560 String h = _twoDigits(hour); | 557 String h = _twoDigits(hour); |
561 String min = _twoDigits(minute); | 558 String min = _twoDigits(minute); |
562 String sec = _twoDigits(second); | 559 String sec = _twoDigits(second); |
563 String ms = _threeDigits(millisecond); | 560 String ms = _threeDigits(millisecond); |
564 String us = microsecond == 0 ? "" : _threeDigits(microsecond); | 561 String us = microsecond == 0 ? "" : _threeDigits(microsecond); |
565 if (isUtc) { | 562 if (isUtc) { |
566 return "$y-$m-${d}T$h:$min:$sec.$ms${us}Z"; | 563 return "$y-$m-${d}T$h:$min:$sec.$ms${us}Z"; |
567 } else { | 564 } else { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 * DateTime berlinWallFell = new DateTime(1989, DateTime.NOVEMBER, 9); | 617 * DateTime berlinWallFell = new DateTime(1989, DateTime.NOVEMBER, 9); |
621 * DateTime dDay = new DateTime(1944, DateTime.JUNE, 6); | 618 * DateTime dDay = new DateTime(1944, DateTime.JUNE, 6); |
622 * Duration difference = berlinWallFell.difference(dDay); | 619 * Duration difference = berlinWallFell.difference(dDay); |
623 * assert(difference.inDays == 16592); | 620 * assert(difference.inDays == 16592); |
624 * | 621 * |
625 * will fail because the difference is actually 16591 days and 23 hours, and | 622 * will fail because the difference is actually 16591 days and 23 hours, and |
626 * [Duration.inDays] only returns the number of whole days. | 623 * [Duration.inDays] only returns the number of whole days. |
627 */ | 624 */ |
628 external Duration difference(DateTime other); | 625 external Duration difference(DateTime other); |
629 | 626 |
630 external DateTime._internal(int year, | 627 external DateTime._internal(int year, int month, int day, int hour, |
631 int month, | 628 int minute, int second, int millisecond, int microsecond, bool isUtc); |
632 int day, | |
633 int hour, | |
634 int minute, | |
635 int second, | |
636 int millisecond, | |
637 int microsecond, | |
638 bool isUtc); | |
639 | 629 |
640 external DateTime._now(); | 630 external DateTime._now(); |
641 | 631 |
642 /// Returns the time as value (millisecond or microsecond since epoch), or | 632 /// Returns the time as value (millisecond or microsecond since epoch), or |
643 /// null if the values are out of range. | 633 /// null if the values are out of range. |
644 external static int _brokenDownDateToValue( | 634 external static int _brokenDownDateToValue( |
645 int year, int month, int day, int hour, int minute, int second, | 635 int year, |
646 int millisecond, int microsecond, bool isUtc); | 636 int month, |
| 637 int day, |
| 638 int hour, |
| 639 int minute, |
| 640 int second, |
| 641 int millisecond, |
| 642 int microsecond, |
| 643 bool isUtc); |
647 | 644 |
648 /** | 645 /** |
649 * The number of milliseconds since | 646 * The number of milliseconds since |
650 * the "Unix epoch" 1970-01-01T00:00:00Z (UTC). | 647 * the "Unix epoch" 1970-01-01T00:00:00Z (UTC). |
651 * | 648 * |
652 * This value is independent of the time zone. | 649 * This value is independent of the time zone. |
653 * | 650 * |
654 * This value is at most | 651 * This value is at most |
655 * 8,640,000,000,000,000ms (100,000,000 days) from the Unix epoch. | 652 * 8,640,000,000,000,000ms (100,000,000 days) from the Unix epoch. |
656 * In other words: `millisecondsSinceEpoch.abs() <= 8640000000000000`. | 653 * In other words: `millisecondsSinceEpoch.abs() <= 8640000000000000`. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 * In accordance with ISO 8601 | 764 * In accordance with ISO 8601 |
768 * a week starts with Monday, which has the value 1. | 765 * a week starts with Monday, which has the value 1. |
769 * | 766 * |
770 * DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00"); | 767 * DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00"); |
771 * assert(moonLanding.weekday == 7); | 768 * assert(moonLanding.weekday == 7); |
772 * assert(moonLanding.weekday == DateTime.SUNDAY); | 769 * assert(moonLanding.weekday == DateTime.SUNDAY); |
773 * | 770 * |
774 */ | 771 */ |
775 external int get weekday; | 772 external int get weekday; |
776 } | 773 } |
OLD | NEW |