diff : function (input, units, asFloat) {
var that = makeAs(input, this),
zoneDiff = (this.zone() - that.zone()) * 6e4,
- diff, output;
+ diff, output, daysAdjust;
units = normalizeUnits(units);
output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
// adjust by taking difference in days, average number of days
// and dst in the given months.
- output += ((this - moment(this).startOf('month')) -
- (that - moment(that).startOf('month'))) / diff;
+ daysAdjust = (this - moment(this).startOf('month')) -
+ (that - moment(that).startOf('month'));
// same as above but with zones, to negate all dst
- output -= ((this.zone() - moment(this).startOf('month').zone()) -
- (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+ daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -
+ (that.zone() - moment(that).startOf('month').zone())) * 6e4;
+ output += daysAdjust / diff;
if (units === 'year') {
output = output / 12;
}
test.done();
},
- 'year diffs' : function (test) {
+ "exact month diffs" : function (test) {
+ // generate all pairs of months and compute month diff, with fixed day
+ // of month = 15.
+
+ var m1, m2;
+ for (m1 = 0; m1 < 12; ++m1) {
+ for (m2 = m1; m2 < 12; ++m2) {
+ test.equal(moment([2013, m2, 15]).diff(moment([2013, m1, 15]), 'months', true), m2 - m1,
+ "month diff from 2013-" + m1 + "-15 to 2013-" + m2 + "-15");
+ }
+ }
+ test.done();
+ },
+
+ "year diffs" : function (test) {
test.expect(10);
// due to floating point math errors, these tests just need to be accurate within 0.00000001