@@ -13,10 +13,7 @@ var Lib = require('../../lib');
1313var ms2DateTime = Lib . ms2DateTime ;
1414var dateTime2ms = Lib . dateTime2ms ;
1515var 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
2118module . 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
10888var monthSteps = [ 2 , 3 , 4 , 6 ] ;
0 commit comments