diff --git a/lib/src/intl/date_format.dart b/lib/src/intl/date_format.dart
index e9def84..a1fc6fb 100644
--- a/lib/src/intl/date_format.dart
+++ b/lib/src/intl/date_format.dart
@@ -324,6 +324,7 @@
     // values with no delimiters, which we currently don't do. Should we?
     var dateFields = new _DateBuilder();
     if (utc) dateFields.utc = true;
+    dateFields._dateOnly = this.dateOnly;
     var stream = new _Stream(inputString);
     _formatFields.forEach((f) => f.parse(stream, dateFields));
     if (strict && !stream.atEnd()) {
@@ -334,6 +335,13 @@
     return dateFields.asDate();
   }
 
+  /// Does our format only only date fields, and no time fields.
+  ///
+  /// For example, 'yyyy-MM-dd' would be true, but 'dd hh:mm' would be false.
+  bool get dateOnly => _dateOnly ??= _checkDateOnly;
+  bool _dateOnly;
+  bool get _checkDateOnly => _formatFields.every((each) => each.forDate);
+
   /// Given user input, attempt to parse the [inputString] into the anticipated
   /// format, treating it as being in UTC.
   ///
diff --git a/lib/src/intl/date_format_field.dart b/lib/src/intl/date_format_field.dart
index 495f8f9..8a5d25e 100644
--- a/lib/src/intl/date_format_field.dart
+++ b/lib/src/intl/date_format_field.dart
@@ -22,6 +22,10 @@
     _trimmedPattern = pattern.trim();
   }
 
+  /// Does this field potentially represent part of a Date, i.e. is not
+  /// time-specific.
+  bool get forDate => true;
+
   /// Return the width of [pattern]. Different widths represent different
   /// formatting options. See the comment for DateFormat for details.
   int get width => pattern.length;
@@ -253,6 +257,17 @@
     new _LoosePatternField(pattern, parent).parse(input, dateFields);
   }
 
+  bool _forDate;
+
+  /// Is this field involved in computing the date portion, as opposed to the
+  /// time.
+  ///
+  /// The [pattern] will contain one or more of a particular format character,
+  /// e.g. "yyyy" for a four-digit year. This hard-codes all the pattern
+  /// characters that pertain to dates. The remaining characters, 'ahHkKms' are
+  /// all time-related. See e.g. [formatField]
+  bool get forDate => _forDate ??= 'cdDEGLMQvyZz'.contains(pattern[0]);
+
   /// Parse a field representing part of a date pattern. Note that we do not
   /// return a value, but rather build up the result in [builder].
   void parseField(_Stream input, _DateBuilder builder) {
@@ -578,27 +593,8 @@
     return padTo(width, date.day);
   }
 
-  String formatDayOfYear(DateTime date) => padTo(width, dayNumberInYear(date));
-
-  /// Return the ordinal day, i.e. the day number in the year.
-  int dayNumberInYear(DateTime date) {
-    if (date.month == 1) return date.day;
-    if (date.month == 2) return date.day + 31;
-    return ordinalDayFromMarchFirst(date) + 59 + (isLeapYear(date) ? 1 : 0);
-  }
-
-  /// Return the day of the year counting March 1st as 1, after which the
-  /// number of days per month is constant, so it's easier to calculate.
-  /// Formula from http://en.wikipedia.org/wiki/Ordinal_date
-  int ordinalDayFromMarchFirst(DateTime date) =>
-      ((30.6 * date.month) - 91.4).floor() + date.day;
-
-  /// Return true if this is a leap year. Rely on [DateTime] to do the
-  /// underlying calculation, even though it doesn't expose the test to us.
-  bool isLeapYear(DateTime date) {
-    var feb29 = new DateTime(date.year, 2, 29);
-    return feb29.month == 2;
-  }
+  String formatDayOfYear(DateTime date) =>
+      padTo(width, _dayOfYear(date.month, date.day, _isLeapYear(date)));
 
   String formatDayOfWeek(DateTime date) {
     // Note that Dart's weekday returns 1 for Monday and 7 for Sunday.
diff --git a/lib/src/intl/date_format_helpers.dart b/lib/src/intl/date_format_helpers.dart
index 3ad651d..171b549 100644
--- a/lib/src/intl/date_format_helpers.dart
+++ b/lib/src/intl/date_format_helpers.dart
@@ -4,6 +4,31 @@
 
 part of intl;
 
+/// Given a month and day number, return the day of the year, all one-based.
+///
+/// For example,
+///  * January 2nd (1, 2) -> 2.
+///  * February 5th (2, 5) -> 36.
+///  * March 1st of a non-leap year (3, 1) -> 60.
+int _dayOfYear(int month, int day, bool leapYear) {
+  if (month == 1) return day;
+  if (month == 2) return day + 31;
+  return ordinalDayFromMarchFirst(month, day) + 59 + (leapYear ? 1 : 0);
+}
+
+/// Return true if this is a leap year. Rely on [DateTime] to do the
+/// underlying calculation, even though it doesn't expose the test to us.
+bool _isLeapYear(DateTime date) {
+  var feb29 = new DateTime(date.year, 2, 29);
+  return feb29.month == 2;
+}
+
+/// Return the day of the year counting March 1st as 1, after which the
+/// number of days per month is constant, so it's easier to calculate.
+/// Formula from http://en.wikipedia.org/wiki/Ordinal_date
+int ordinalDayFromMarchFirst(int month, int day) =>
+    ((30.6 * month) - 91.4).floor() + day;
+
 /// A class for holding onto the data for a date so that it can be built
 /// up incrementally.
 class _DateBuilder {
@@ -19,6 +44,18 @@
   bool pm = false;
   bool utc = false;
 
+  /// Is this constructing a pure date.
+  ///
+  /// This is important because some locales change times at midnight,
+  /// e.g. Brazil. So if we try to create a DateTime representing a date at
+  /// midnight on the day of transition it will jump forward or back 1 hour.  If
+  /// it jumps forward that's mostly harmless if we only care about the
+  /// date. But if it jumps backwards that will change the date, which is
+  /// bad. Compensate by adjusting the time portion forward. But only do that
+  /// when we're explicitly trying to construct a date, which we can tell from
+  /// the format.
+  bool _dateOnly = false;
+
   // Functions that exist just to be closurized so we can pass them to a general
   // method.
   void setYear(x) {
@@ -67,7 +104,16 @@
     // which will catch cases like "14:00:00 PM".
     var date = asDate();
     _verify(hour24, date.hour, date.hour, "hour", s, date);
-    _verify(day, date.day, date.day, "day", s, date);
+    if (day > 31) {
+      // We have an ordinal date, compute the corresponding date for the result
+      // and compare to that.
+      var leapYear = _isLeapYear(date);
+      var correspondingDay = _dayOfYear(date.month, date.day, leapYear);
+      _verify(day, correspondingDay, correspondingDay, "day", s, date);
+    } else {
+      // We have the day of the month, compare directly.
+      _verify(day, date.day, date.day, "day", s, date);
+    }
     _verify(year, date.year, date.year, "year", s, date);
   }
 
@@ -83,23 +129,62 @@
 
   /// Return a date built using our values. If no date portion is set,
   /// use the "Epoch" of January 1, 1970.
-  DateTime asDate({int retries: 10}) {
+  DateTime asDate({int retries: 3}) {
     // TODO(alanknight): Validate the date, especially for things which
     // can crash the VM, e.g. large month values.
-    var result;
     if (utc) {
-      result = new DateTime.utc(
+      return new DateTime.utc(
           year, month, day, hour24, minute, second, fractionalSecond);
     } else {
-      result = new DateTime(
+      var preliminaryResult = new DateTime(
           year, month, day, hour24, minute, second, fractionalSecond);
-      // TODO(alanknight): Issue 15560 means non-UTC dates occasionally come out
-      // in UTC, or, alternatively, are constructed as if in UTC and then have
-      // the offset subtracted. If that happens, retry, several times if
-      // necessary.
-      if (retries > 0 && (result.hour != hour24 || result.day != day)) {
-        result = asDate(retries: retries - 1);
-      }
+      return _correctForErrors(preliminaryResult, retries);
+    }
+  }
+
+  static final Duration _zeroDuration = new Duration();
+
+  /// Given a local DateTime, check for errors and try to compensate for them if
+  /// possible.
+  DateTime _correctForErrors(DateTime result, int retries) {
+    // There are 3 kinds of errors that we know of
+    //
+    // 1 - Issue 15560, sometimes we get UTC even when we asked for local, or
+    // they get constructed as if in UTC and then have the offset
+    // subtracted. Retry, possibly several times, until we get something that
+    // looks valid, or we give up.
+    //
+    // 2 - Timezone transitions. If we ask for the time during a timezone
+    // transition then it will offset it by that transition. This is
+    // particularly a problem if the timezone transition happens at midnight,
+    // and we're looking for a date with no time component. This happens in
+    // Brazil, and we can end up with 11:00pm the previous day. Add time to
+    // compensate.
+    //
+    // 3 - Invalid input which the constructor nevertheless accepts. Just
+    // return what it created, and verify will catch it if we're in strict
+    // mode.
+    var leapYear = _isLeapYear(result);
+    var correspondingDay = _dayOfYear(result.month, result.day, leapYear);
+
+    var looksLikeUtc = result.timeZoneOffset == _zeroDuration;
+    if (looksLikeUtc &&
+        (result.hour != hour24 || result.day != correspondingDay)) {
+      // This may be a UTC failure. Retry and if the result doesn't look
+      // like it's in the UTC time zone, use that instead.
+      var retry = asDate(retries: retries - 1);
+      if (retry.timeZoneOffset != _zeroDuration) return retry;
+    }
+    if (_dateOnly && day != correspondingDay) {
+      // If we're _dateOnly, then hours should be zero, but might have been
+      // offset to e.g. 11:00pm the previous day. Add that time back in. We
+      // only care about jumps backwards. If we were offset to e.g. 1:00am the
+      // same day that's all right for a date. It gets the day correct, and we
+      // have no way to even represent midnight on a day when it doesn't
+      // happen.
+      var adjusted = result.add(new Duration(hours: (24 - result.hour)));
+      if (_dayOfYear(adjusted.month, adjusted.day, leapYear) == day)
+        return adjusted;
     }
     return result;
   }
diff --git a/test/brazil_timezone_test.dart b/test/brazil_timezone_test.dart
new file mode 100644
index 0000000..7c4f0ab
--- /dev/null
+++ b/test/brazil_timezone_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test date formatting and parsing while the system time zone is set to
+/// America/Sao Paulo.
+///
+/// In Brazil the time change spring/fall happens at midnight. This can make
+/// operations working with dates as midnight on a particular day fail. For
+/// example, in the (Brazilian) autumn, a date might "fall back" an hour and be
+/// on the previous day. This test verifies that we're handling those situations.
+import 'package:test/test.dart';
+import 'dart:io';
+import 'dart:convert';
+
+// This test relies on setting the TZ environment variable to affect the
+// system's time zone calculations. That's only effective on Linux environments,
+// and would only work in a browser if we were able to set it before the browser
+// launched, which we aren't. So restrict this test to the VM and Linux.
+@TestOn('vm')
+@TestOn('linux')
+
+/// The VM arguments we were given, most importantly package-root.
+final vmArgs = Platform.executableArguments;
+
+final dart = Platform.executable;
+
+main() {
+  // The VM can be invoked with a "-DPACKAGE_DIR=<directory>" argument to
+  // indicate the root of the Intl package. If it is not provided, we assume
+  // that the root of the Intl package is the current directory.
+  var packageDir = new String.fromEnvironment('PACKAGE_DIR');
+  var packageRelative = 'test/date_time_format_local_even_test.dart';
+  var fileToSpawn =
+      packageDir == null ? packageRelative : '$packageDir/$packageRelative';
+
+  test("Run tests in Sao Paulo time zone", () async {
+    List<String> args = []
+      ..addAll(vmArgs)
+      ..add(fileToSpawn);
+    var result = await Process.run(dart, args,
+        stdoutEncoding: UTF8,
+        stderrEncoding: UTF8,
+        includeParentEnvironment: true,
+        environment: {'TZ': 'America/Sao_Paulo'});
+    // Because the actual tests are run in a spawned parocess their output isn't
+    // directly visible here. To debug, it's necessary to look at the output of
+    // that test, so we print it here for convenience.
+    print(
+        "Spawning test to run in the America/Sao Paulo time zone. Stderr is:");
+    print(result.stderr);
+    print("Spawned test in America/Sao Paulo time zone has Stdout:");
+    print(result.stdout);
+    expect(result.exitCode, 0,
+        reason: "Spawned test failed. See the test log from stderr to debug");
+  });
+}
diff --git a/test/date_time_format_test_core.dart b/test/date_time_format_test_core.dart
index c1a4dc0..e6f88f5 100644
--- a/test/date_time_format_test_core.dart
+++ b/test/date_time_format_test_core.dart
@@ -160,7 +160,7 @@
       var format = new DateFormat(skeleton, localeName);
       if (forceAscii) format.useNativeDigits = false;
       var actualResult = format.format(date);
-      var parsed = format.parse(actualResult);
+      var parsed = format.parseStrict(actualResult);
       var thenPrintAgain = format.format(parsed);
       expect(thenPrintAgain, equals(actualResult));
     }
@@ -399,7 +399,11 @@
   Map<int, DateTime> generateDates(int year, int leapDay) =>
       new Iterable.generate(365 + leapDay, (n) => n + 1)
           .map((day) {
-            var result = new DateTime(year, 1, day);
+            // Typically a "date" would have a time value of zero, but we
+            // give them an hour value, because they can get created with an
+            // offset to the previous day in time zones where the daylight
+            // savings transition happens at midnight (e.g. Brazil).
+            var result = new DateTime(year, 1, day, 3);
             // TODO(alanknight): This is a workaround for dartbug.com/15560.
             if (result.toUtc() == result) result = new DateTime(year, 1, day);
             return result;
@@ -415,7 +419,12 @@
       expect(formatted, (number + 1).toString());
       var formattedWithYear = withYear.format(date);
       var parsed = withYear.parse(formattedWithYear);
-      expect(parsed, date);
+      // Only compare the date portion, because time zone changes (e.g. DST) can
+      // cause the hour values to be different.
+      expect(parsed.year, date.year);
+      expect(parsed.month, date.month);
+      expect(parsed.day, date.day,
+          reason: 'Mismatch between parsed ($parsed) and original ($date)');
     });
   }
 
