diff --git a/lib/clock.dart b/lib/clock.dart
index 933dee8..f3327f7 100644
--- a/lib/clock.dart
+++ b/lib/clock.dart
@@ -23,6 +23,35 @@
 /// A predefined instance of [Clock] that's based on system clock.
 const SYSTEM_CLOCK = const Clock();
 
+/// Days in a month. This array uses 1-based month numbers, i.e. January is
+/// the 1-st element in the array, not the 0-th.
+const _DAYS_IN_MONTH =
+    const [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+int _daysInMonth(int year, int month) =>
+    (month == DateTime.FEBRUARY && _isLeapYear(year))
+    ? 29 : _DAYS_IN_MONTH[month];
+
+bool _isLeapYear(int year) =>
+    (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
+
+/// Takes a [date] that may be outside the allowed range of dates for a given
+/// [month] in a given [year] and returns the closest date that is within the
+/// allowed range.
+///
+/// For example:
+///
+/// February 31, 2013 => February 28, 2013
+///
+/// When jumping from month to month or from leap year to common year we may
+/// end up in a month that has fewer days than the month we are jumping from.
+/// In that case it is impossible to preserve the exact date. So we "clamp" the
+/// date value to fit within the month. For example, jumping from March 31 one
+/// month back takes us to February 28 (or 29 during a leap year), as February
+/// doesn't have 31-st date.
+int _clampDate(int date, int year, int month) =>
+    date.clamp(1, _daysInMonth(year, month));
+
 /// Provides points in time relative to the current point in time, for example:
 /// now, 2 days ago, 4 weeks from now, etc.
 ///
@@ -133,10 +162,13 @@
   /// Return the point in time [months] ago on the same date.
   DateTime monthsAgo(int months) {
     var time = now();
+    var m = (time.month - months - 1) % 12 + 1;
+    var y = time.year - (months + 12 - time.month) ~/ 12;
+    var d = _clampDate(time.day, y, m);
     return new DateTime(
-        time.year,
-        time.month - months,
-        time.day,
+        y,
+        m,
+        d,
         time.hour,
         time.minute,
         time.second,
@@ -145,15 +177,31 @@
   }
 
   /// Return the point in time [months] from now on the same date.
-  DateTime monthsFromNow(int months) => monthsAgo(-months);
+  DateTime monthsFromNow(int months) {
+    var time = now();
+    var m = (time.month + months - 1) % 12 + 1;
+    var y = time.year + (months + time.month - 1) ~/ 12;
+    var d = _clampDate(time.day, y, m);
+    return new DateTime(
+        y,
+        m,
+        d,
+        time.hour,
+        time.minute,
+        time.second,
+        time.millisecond
+    );
+  }
 
   /// Return the point in time [years] ago on the same date.
   DateTime yearsAgo(int years) {
     var time = now();
+    var y = time.year - years;
+    var d = _clampDate(time.day, y, time.month);
     return new DateTime(
-        time.year - years,
+        y,
         time.month,
-        time.day,
+        d,
         time.hour,
         time.minute,
         time.second,
diff --git a/test/clock_test.dart b/test/clock_test.dart
index a9e3bc6..73cdeb4 100644
--- a/test/clock_test.dart
+++ b/test/clock_test.dart
@@ -1,13 +1,13 @@
 // Copyright 2013 Google Inc. All Rights Reserved.
 //
-// Licensed under the Apache License, Version 2.0 (the "License");
+// Licensed under the Apache License, Version 2.0 (the 'License');
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
 //     http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
+// distributed under the License is distributed on an 'AS IS' BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
@@ -17,20 +17,30 @@
 import 'package:unittest/unittest.dart';
 import 'package:quiver/time.dart';
 
+Clock from(int y, int m, int d) => new Clock.fixed(new DateTime(y, m, d));
+
+expectDate(DateTime date, int y, [int m = 1, int d = 1]) {
+  expect(date, new DateTime(y, m, d));
+}
+
 main() {
   group('clock', () {
-    var subject = new Clock.fixed(new DateTime(2013));
+    Clock subject;
 
-    test("should return a non-null value from system clock", () {
+    setUp(() {
+      subject = new Clock.fixed(new DateTime(2013));
+    });
+
+    test('should return a non-null value from system clock', () {
       expect(new Clock().now(), isNotNull);
       expect(SYSTEM_CLOCK.now(), isNotNull);
     });
 
     // This test may be flaky on certain systems. I ran it over 10 million
     // cycles on my machine without any failures, but that's no guarantee.
-    test("should be close enough to system clock", () {
-      // I picked 2ms because 1ms was starting to get flaky.
-      var epsilon = 2;
+    test('should be close enough to system clock', () {
+      // At 10ms the test doesn't seem to be flaky.
+      var epsilon = 10;
       expect(new DateTime.now().difference(
           new Clock().now()).inMilliseconds.abs(),
               lessThan(epsilon));
@@ -39,7 +49,7 @@
               lessThan(epsilon));
     });
 
-    test("should return time provided by custom TimeFunction", () {
+    test('should return time provided by custom TimeFunction', () {
       var time = new DateTime(2013);
       var fixedClock = new Clock(() => time);
       expect(fixedClock.now(), new DateTime(2013));
@@ -48,19 +58,19 @@
       expect(fixedClock.now(), new DateTime(2014));
     });
 
-    test("should return fixed time", () {
+    test('should return fixed time', () {
       expect(new Clock.fixed(new DateTime(2013)).now(), new DateTime(2013));
     });
 
-    test("should return time Duration ago", () {
+    test('should return time Duration ago', () {
       expect(subject.agoBy(new Duration(days: 366)), new DateTime(2012));
     });
 
-    test("should return time Duration from now", () {
+    test('should return time Duration from now', () {
       expect(subject.fromNowBy(new Duration(days: 365)), new DateTime(2014));
     });
 
-    test("should return time parts ago", () {
+    test('should return time parts ago', () {
       expect(subject.ago(
           days: 1,
           hours: 1,
@@ -70,7 +80,7 @@
           microseconds: 1000), new DateTime(2012, 12, 30, 22, 58, 58, 998));
     });
 
-    test("should return time parts from now", () {
+    test('should return time parts from now', () {
       expect(subject.fromNow(
           days: 1,
           hours: 1,
@@ -80,124 +90,138 @@
           microseconds: 1000), new DateTime(2013, 1, 2, 1, 1, 1, 2));
     });
 
-    test("should return time micros ago", () {
+    test('should return time micros ago', () {
       expect(subject.microsAgo(1000),
           new DateTime(2012, 12, 31, 23, 59, 59, 999));
     });
 
-    test("should return time micros from now", () {
+    test('should return time micros from now', () {
       expect(subject.microsFromNow(1000),
           new DateTime(2013, 1, 1, 0, 0, 0, 1));
     });
 
-    test("should return time millis ago", () {
+    test('should return time millis ago', () {
       expect(subject.millisAgo(1000),
           new DateTime(2012, 12, 31, 23, 59, 59, 000));
     });
 
-    test("should return time millis from now", () {
+    test('should return time millis from now', () {
       expect(subject.millisFromNow(3),
           new DateTime(2013, 1, 1, 0, 0, 0, 3));
     });
 
-    test("should return time seconds ago", () {
+    test('should return time seconds ago', () {
       expect(subject.secondsAgo(10),
           new DateTime(2012, 12, 31, 23, 59, 50, 000));
     });
 
-    test("should return time seconds from now", () {
+    test('should return time seconds from now', () {
       expect(subject.secondsFromNow(3),
           new DateTime(2013, 1, 1, 0, 0, 3, 0));
     });
 
-    test("should return time minutes ago", () {
+    test('should return time minutes ago', () {
       expect(subject.minutesAgo(10),
           new DateTime(2012, 12, 31, 23, 50, 0, 000));
     });
 
-    test("should return time minutes from now", () {
+    test('should return time minutes from now', () {
       expect(subject.minutesFromNow(3),
           new DateTime(2013, 1, 1, 0, 3, 0, 0));
     });
 
-    test("should return time hours ago", () {
+    test('should return time hours ago', () {
       expect(subject.hoursAgo(10),
           new DateTime(2012, 12, 31, 14, 0, 0, 000));
     });
 
-    test("should return time hours from now", () {
+    test('should return time hours from now', () {
       expect(subject.hoursFromNow(3),
           new DateTime(2013, 1, 1, 3, 0, 0, 0));
     });
 
-    test("should return time days ago", () {
-      expect(subject.daysAgo(10),
-          new DateTime(2012, 12, 22, 0, 0, 0, 000));
+    test('should return time days ago', () {
+      expectDate(subject.daysAgo(10), 2012, 12, 22);
     });
 
-    test("should return time days from now", () {
-      expect(subject.daysFromNow(3),
-          new DateTime(2013, 1, 4, 0, 0, 0, 0));
+    test('should return time days from now', () {
+      expectDate(subject.daysFromNow(3), 2013, 1, 4);
     });
 
-    test("should return time months ago on the same date", () {
-      expect(subject.monthsAgo(1),
-          new DateTime(2012, 12, 1, 0, 0, 0, 000));
-      expect(subject.monthsAgo(2),
-          new DateTime(2012, 11, 1, 0, 0, 0, 000));
-      expect(subject.monthsAgo(3),
-          new DateTime(2012, 10, 1, 0, 0, 0, 000));
-      expect(subject.monthsAgo(4),
-          new DateTime(2012, 9, 1, 0, 0, 0, 000));
+    test('should return time months ago on the same date', () {
+      expectDate(subject.monthsAgo(1), 2012, 12, 1);
+      expectDate(subject.monthsAgo(2), 2012, 11, 1);
+      expectDate(subject.monthsAgo(3), 2012, 10, 1);
+      expectDate(subject.monthsAgo(4), 2012, 9, 1);
     });
 
-    test("should return time months from now on the same date", () {
-      expect(subject.monthsFromNow(1),
-          new DateTime(2013, 2, 1, 0, 0, 0, 0));
-      expect(subject.monthsFromNow(2),
-          new DateTime(2013, 3, 1, 0, 0, 0, 0));
-      expect(subject.monthsFromNow(3),
-          new DateTime(2013, 4, 1, 0, 0, 0, 0));
-      expect(subject.monthsFromNow(4),
-          new DateTime(2013, 5, 1, 0, 0, 0, 0));
+    test('should return time months from now on the same date', () {
+      expectDate(subject.monthsFromNow(1), 2013, 2, 1);
+      expectDate(subject.monthsFromNow(2), 2013, 3, 1);
+      expectDate(subject.monthsFromNow(3), 2013, 4, 1);
+      expectDate(subject.monthsFromNow(4), 2013, 5, 1);
     });
 
-    test("should return time years ago on the same date", () {
-      expect(subject.yearsAgo(1),
-          new DateTime(2012, 1, 1, 0, 0, 0, 000));  // leap year
-      expect(subject.yearsAgo(2),
-          new DateTime(2011, 1, 1, 0, 0, 0, 000));
-      expect(subject.yearsAgo(3),
-          new DateTime(2010, 1, 1, 0, 0, 0, 000));
-      expect(subject.yearsAgo(4),
-          new DateTime(2009, 1, 1, 0, 0, 0, 000));
-      expect(subject.yearsAgo(5),
-          new DateTime(2008, 1, 1, 0, 0, 0, 000));  // leap year
-      expect(subject.yearsAgo(6),
-          new DateTime(2007, 1, 1, 0, 0, 0, 000));
-      expect(subject.yearsAgo(30),
-          new DateTime(1983, 1, 1, 0, 0, 0, 000));
-      expect(subject.yearsAgo(2013),
-          new DateTime(0, 1, 1, 0, 0, 0, 000));
+    test('should go from 2013-05-31 to 2012-11-30', () {
+      expectDate(from(2013, 5, 31).monthsAgo(6), 2012, 11, 30);
     });
 
-    test("should return time years from now on the same date", () {
-      expect(subject.yearsFromNow(1),
-          new DateTime(2014, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(2),
-          new DateTime(2015, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(3),
-          new DateTime(2016, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(4),
-          new DateTime(2017, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(5),
-          new DateTime(2018, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(6),
-          new DateTime(2019, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(30),
-          new DateTime(2043, 1, 1, 0, 0, 0, 0));
-      expect(subject.yearsFromNow(1000),
-          new DateTime(3013, 1, 1, 0, 0, 0, 0));
+    test('should go from 2013-03-31 to 2013-02-28 (common year)', () {
+      expectDate(from(2013, 3, 31).monthsAgo(1), 2013, 2, 28);
+    });
+
+    test('should go from 2013-05-31 to 2013-02-28 (common year)', () {
+      expectDate(from(2013, 5, 31).monthsAgo(3), 2013, 2, 28);
+    });
+
+    test('should go from 2004-03-31 to 2004-02-29 (leap year)', () {
+      expectDate(from(2004, 3, 31).monthsAgo(1), 2004, 2, 29);
+    });
+
+    test('should go from 2013-03-31 to 2013-06-30', () {
+      expectDate(from(2013, 3, 31).monthsFromNow(3), 2013, 6, 30);
+    });
+
+    test('should go from 2003-12-31 to 2004-02-29 (common to leap)', () {
+      expectDate(from(2003, 12, 31).monthsFromNow(2), 2004, 2, 29);
+    });
+
+    test('should go from 2004-02-29 to 2003-02-28 by year', () {
+      expectDate(from(2004, 2, 29).yearsAgo(1), 2003, 2, 28);
+    });
+
+    test('should go from 2004-02-29 to 2003-02-28 by month', () {
+      expectDate(from(2004, 2, 29).monthsAgo(12), 2003, 2, 28);
+    });
+
+    test('should go from 2004-02-29 to 2005-02-28 by year', () {
+      expectDate(from(2004, 2, 29).yearsFromNow(1), 2005, 2, 28);
+    });
+
+    test('should go from 2004-02-29 to 2005-02-28 by month', () {
+      expectDate(from(2004, 2, 29).monthsFromNow(12), 2005, 2, 28);
+    });
+
+    test('should return time years ago on the same date', () {
+      expectDate(subject.yearsAgo(1), 2012, 1, 1);  // leap year
+      expectDate(subject.yearsAgo(2), 2011, 1, 1);
+      expectDate(subject.yearsAgo(3), 2010, 1, 1);
+      expectDate(subject.yearsAgo(4), 2009, 1, 1);
+      expectDate(subject.yearsAgo(5), 2008, 1, 1);  // leap year
+      expectDate(subject.yearsAgo(6), 2007, 1, 1);
+      expectDate(subject.yearsAgo(30), 1983, 1, 1);
+      expectDate(subject.yearsAgo(2013), 0, 1, 1);
+    });
+
+    test('should return time years from now on the same date', () {
+      expectDate(subject.yearsFromNow(1), 2014, 1, 1);
+      expectDate(subject.yearsFromNow(2), 2015, 1, 1);
+      expectDate(subject.yearsFromNow(3), 2016, 1, 1);
+      expectDate(subject.yearsFromNow(4), 2017, 1, 1);
+      expectDate(subject.yearsFromNow(5), 2018, 1, 1);
+      expectDate(subject.yearsFromNow(6), 2019, 1, 1);
+      expectDate(subject.yearsFromNow(30), 2043, 1, 1);
+      expectDate(subject.yearsFromNow(1000), 3013, 1, 1);
     });
 
   });
