Skip to content

Commit afa8965

Browse files
committed
separate monthly periods from daily periods defined by milliseconds
1 parent be52281 commit afa8965

File tree

4 files changed

+53
-72
lines changed

4 files changed

+53
-72
lines changed

src/plots/cartesian/align_period.js

+51-71
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ var Lib = require('../../lib');
1313
var ms2DateTime = Lib.ms2DateTime;
1414
var dateTime2ms = Lib.dateTime2ms;
1515
var incrementMonth = Lib.incrementMonth;
16-
var constants = require('../../constants/numerical');
17-
var ONEDAY = constants.ONEDAY;
18-
var ONEAVGMONTH = constants.ONEAVGMONTH;
19-
var ONEAVGYEAR = constants.ONEAVGYEAR;
16+
var ONEDAY = require('../../constants/numerical').ONEDAY;
2017

2118
module.exports = function alignPeriod(trace, ax, axLetter, vals) {
2219
if(ax.type !== 'date') return vals;
@@ -25,84 +22,67 @@ module.exports = function alignPeriod(trace, ax, axLetter, vals) {
2522
if(!alignment) return vals;
2623

2724
var period = trace[axLetter + 'period'];
28-
var mPeriod;
25+
var mPeriod, dPeriod;
2926
if(isNumeric(period)) {
30-
period = +period;
31-
if(period <= 0) return vals;
27+
dPeriod = +period;
28+
dPeriod /= ONEDAY; // convert milliseconds to days
29+
dPeriod = Math.round(dPeriod);
30+
if(dPeriod <= 0) return vals;
3231
} else if(typeof period === 'string' && period.charAt(0) === 'M') {
3332
var n = +(period.substring(1));
3433
if(n > 0 && Math.round(n) === n) {
3534
mPeriod = n;
36-
period = n * ONEAVGMONTH;
3735
} else return vals;
3836
}
3937

40-
if(period > 0) {
41-
var calendar = ax.calendar;
42-
43-
var isStart = 'start' === alignment;
44-
// var isMiddle = 'middle' === alignment;
45-
var isEnd = 'end' === alignment;
46-
47-
var period0 = trace[axLetter + 'period0'];
48-
var base = dateTime2ms(period0, calendar) || 0;
49-
50-
var newVals = [];
51-
var len = vals.length;
52-
for(var i = 0; i < len; i++) {
53-
var v = vals[i] - base;
54-
55-
var dateStr = ms2DateTime(v, 0, calendar);
56-
var d = new Date(dateStr);
57-
var year = d.getUTCFullYear();
58-
var month = d.getUTCMonth();
59-
var day = d.getUTCDate();
60-
61-
var newD;
62-
var startTime;
63-
var endTime;
64-
65-
var nMonths = Math.floor(period / ONEAVGMONTH) % 12;
66-
var nYears = Math.floor((period - nMonths * ONEAVGMONTH) / ONEAVGYEAR);
67-
var nDays = Math.floor((period - nMonths * ONEAVGMONTH - nYears * ONEAVGYEAR) / ONEDAY);
68-
if(nYears && nMonths) nDays = 0;
69-
70-
var y1 = year + nYears;
71-
var m1 = month + nMonths;
72-
var d1 = day + nDays;
73-
if(nDays || nMonths || nYears) {
74-
if(nDays) {
75-
startTime = Date.UTC(year, month, day);
76-
var monthDays = new Date(y1, m1 + 1, 0).getUTCDate();
77-
if(d1 > monthDays) {
78-
d1 -= monthDays;
79-
m1 += 1;
80-
if(m1 > 11) {
81-
m1 -= 12;
82-
y1 += 1;
83-
}
84-
}
85-
endTime = Date.UTC(y1, m1, d1);
86-
} else if(nMonths) {
87-
startTime = Date.UTC(year, nYears ? month : roundMonth(month, nMonths));
88-
endTime = incrementMonth(startTime, mPeriod ? mPeriod : nMonths, calendar);
89-
} else {
90-
startTime = Date.UTC(year, 0);
91-
endTime = Date.UTC(y1, 0);
92-
}
93-
94-
newD = new Date(
95-
isStart ? startTime :
96-
isEnd ? endTime :
97-
(startTime + endTime) / 2
98-
);
99-
}
38+
var calendar = ax.calendar;
39+
40+
var isStart = 'start' === alignment;
41+
// var isMiddle = 'middle' === alignment;
42+
var isEnd = 'end' === alignment;
43+
44+
var period0 = trace[axLetter + 'period0'];
45+
var base = dateTime2ms(period0, calendar) || 0;
10046

101-
newVals[i] = newD ? newD.getTime() + base : vals[i];
47+
var newVals = [];
48+
var len = vals.length;
49+
for(var i = 0; i < len; i++) {
50+
var v = vals[i] - base;
51+
52+
var dateStr = ms2DateTime(v, 0, calendar);
53+
var d = new Date(dateStr);
54+
var year = d.getUTCFullYear();
55+
var month = d.getUTCMonth();
56+
var day = d.getUTCDate();
57+
58+
var startTime, endTime;
59+
if(dPeriod) {
60+
startTime = Date.UTC(year, month, day);
61+
endTime = startTime + dPeriod * ONEDAY;
10262
}
103-
return newVals;
63+
64+
if(mPeriod) {
65+
var nYears = Math.floor(mPeriod / 12);
66+
var nMonths = mPeriod % 12;
67+
68+
if(nMonths) {
69+
startTime = Date.UTC(year, nYears ? month : roundMonth(month, nMonths));
70+
endTime = incrementMonth(startTime, mPeriod, calendar);
71+
} else {
72+
startTime = Date.UTC(year, 0);
73+
endTime = Date.UTC(year + nYears, 0);
74+
}
75+
}
76+
77+
var newD = new Date(
78+
isStart ? startTime :
79+
isEnd ? endTime :
80+
(startTime + endTime) / 2
81+
);
82+
83+
newVals[i] = newD.getTime() + base;
10484
}
105-
return vals;
85+
return newVals;
10686
};
10787

10888
var monthSteps = [2, 3, 4, 6];

src/traces/scatter/attributes.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ function axisPeriod(axis) {
2929
'Only relevant when the axis `type` is *date*.',
3030
'Sets the period positioning in milliseconds or *M<n>* on the ' + axis + ' axis.',
3131
'Special values in the form of *M<n>* could be used to declare',
32-
'the number of "average" months. In this case `n` must be a positive integer.'
32+
'the number of "average" months. In this case `n` must be a positive integer.',
33+
'When using milliseconds the period is rounded and applied as the number of days.'
3334
].join(' ')
3435
};
3536
}
-1 Bytes
Loading
3.43 KB
Loading

0 commit comments

Comments
 (0)