| Index: runtime/lib/date_patch.dart
|
| diff --git a/runtime/lib/date_patch.dart b/runtime/lib/date_patch.dart
|
| index 4697901739fb7b71363e9c8f1cd84358c5ec6d07..1ecf8129949739a0477559b80a3b75530fde585a 100644
|
| --- a/runtime/lib/date_patch.dart
|
| +++ b/runtime/lib/date_patch.dart
|
| @@ -284,14 +284,24 @@ patch class DateTime {
|
| }
|
|
|
| if (!isUtc) {
|
| - // Note that we need to remove the local timezone adjustement before
|
| + // Note that we need to remove the local timezone adjustment before
|
| // asking for the correct zone offset.
|
| int adjustment = _localTimeZoneAdjustmentInSeconds() *
|
| Duration.MICROSECONDS_PER_SECOND;
|
| + // The adjustment is independent of the actual date and of the daylight
|
| + // saving time. It is positive east of the Prime Meridian and negative
|
| + // west of it, e.g. -28800 sec for America/Los_Angeles timezone.
|
|
|
| int zoneOffset =
|
| _timeZoneOffsetInSeconds(microsecondsSinceEpoch - adjustment);
|
| + // The zoneOffset depends on the actual date and reflects any daylight
|
| + // saving time and/or historical deviation relative to UTC time.
|
| + // It is positive east of the Prime Meridian and negative west of it,
|
| + // e.g. -25200 sec for America/Los_Angeles timezone during DST.
|
| microsecondsSinceEpoch -= zoneOffset * Duration.MICROSECONDS_PER_SECOND;
|
| + // The resulting microsecondsSinceEpoch value is therefore the calculated
|
| + // UTC value decreased by a (positive if east of GMT) timezone adjustment
|
| + // and decreased by typically one hour if DST is in effect.
|
| }
|
| if (microsecondsSinceEpoch.abs() >
|
| _MAX_MILLISECONDS_SINCE_EPOCH * Duration.MICROSECONDS_PER_MILLISECOND) {
|
| @@ -314,7 +324,8 @@ patch class DateTime {
|
| * Adapted from V8's date implementation. See ECMA 262 - 15.9.1.9.
|
| */
|
| static int _equivalentYear(int year) {
|
| - // Returns the week day (in range 0 - 6).
|
| + // Returns year y so that _weekDay(y) == _weekDay(year).
|
| + // _weekDay returns the week day (in range 0 - 6).
|
| // 1/1/1956 was a Sunday (i.e. weekday 0). 1956 was a leap-year.
|
| // 1/1/1967 was a Sunday (i.e. weekday 0).
|
| // Without leap years a subsequent year has a week day + 1 (for example
|
| @@ -352,22 +363,24 @@ patch class DateTime {
|
| }
|
|
|
| /**
|
| - * Returns a date in seconds that is equivalent to the current date. An
|
| - * equivalent date has the same fields (`month`, `day`, etc.) as the
|
| - * [this], but the `year` is in the range [1970..2037].
|
| + * Returns a date in seconds that is equivalent to the given
|
| + * date in microseconds [microsecondsSinceEpoch]. An equivalent
|
| + * date has the same fields (`month`, `day`, etc.) as the given
|
| + * date, but the `year` is in the range [1901..2038].
|
| *
|
| * * The time since the beginning of the year is the same.
|
| - * * If [this] is in a leap year then the returned seconds are in a leap
|
| - * year, too.
|
| - * * The week day of [this] is the same as the one for the returned date.
|
| + * * If the given date is in a leap year then the returned
|
| + * seconds are in a leap year, too.
|
| + * * The week day of given date is the same as the one for the
|
| + * returned date.
|
| */
|
| static int _equivalentSeconds(int microsecondsSinceEpoch) {
|
| - const int CUT_OFF_SECONDS = 2100000000;
|
| + const int CUT_OFF_SECONDS = 0x7FFFFFFF;
|
|
|
| int secondsSinceEpoch = _flooredDivision(microsecondsSinceEpoch,
|
| Duration.MICROSECONDS_PER_SECOND);
|
|
|
| - if (secondsSinceEpoch < 0 || secondsSinceEpoch >= CUT_OFF_SECONDS) {
|
| + if (secondsSinceEpoch.abs() > CUT_OFF_SECONDS) {
|
| int year = _yearsFromSecondsSinceEpoch(secondsSinceEpoch);
|
| int days = _dayFromYear(year);
|
| int equivalentYear = _equivalentYear(year);
|
|
|