提交 98bab4c5 编写于 作者: S sushuang

Fix #6543. (Consider DST in calendar)

上级 6582eba1
...@@ -7,7 +7,7 @@ define(function (require) { ...@@ -7,7 +7,7 @@ define(function (require) {
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
// (24*60*60*1000) // (24*60*60*1000)
var ONE_DAY = 86400000; var PROXIMATE_ONE_DAY = 86400000;
/** /**
* Calendar * Calendar
...@@ -76,7 +76,16 @@ define(function (require) { ...@@ -76,7 +76,16 @@ define(function (require) {
* get date info * get date info
* *
* @param {string|number} date date * @param {string|number} date date
* @return {Object} info * @return {Object}
* {
* y: string, local full year, eg., '1940',
* m: string, local month, from '01' ot '12',
* d: string, local date, from '01' to '31' (if exists),
* day: It is not date.getDay(). It is the location of the cell in a week, from 0 to 6,
* time: timestamp,
* formatedDate: string, yyyy-MM-dd,
* date: original date object.
* }
*/ */
getDateInfo: function (date) { getDateInfo: function (date) {
...@@ -111,9 +120,10 @@ define(function (require) { ...@@ -111,9 +120,10 @@ define(function (require) {
return this.getDateInfo(date); return this.getDateInfo(date);
} }
var time = this.getDateInfo(date).time; date = new Date(this.getDateInfo(date).time);
date.setDate(date.getDate() + n);
return this.getDateInfo(time + ONE_DAY * n); return this.getDateInfo(date);
}, },
update: function (ecModel, api) { update: function (ecModel, api) {
...@@ -179,18 +189,18 @@ define(function (require) { ...@@ -179,18 +189,18 @@ define(function (require) {
} }
var week = dayInfo.day; var week = dayInfo.day;
var nthWeek = this._getRangeInfo([range.start.time, date]).weeks; var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek;
if (this._orient === 'vertical') { if (this._orient === 'vertical') {
return [ return [
this._rect.x + week * this._sw + this._sw / 2, this._rect.x + week * this._sw + this._sw / 2,
this._rect.y + (nthWeek - 1) * this._sh + this._sh / 2 this._rect.y + nthWeek * this._sh + this._sh / 2
]; ];
} }
return [ return [
this._rect.x + (nthWeek - 1) * this._sw + this._sw / 2, this._rect.x + nthWeek * this._sw + this._sw / 2,
this._rect.y + week * this._sh + this._sh / 2 this._rect.y + week * this._sh + this._sh / 2
]; ];
...@@ -328,25 +338,60 @@ define(function (require) { ...@@ -328,25 +338,60 @@ define(function (require) {
* *
* @private * @private
* @param {Array} range range ['2017-01-01', '2017-07-08'] * @param {Array} range range ['2017-01-01', '2017-07-08']
* If range[0] > range[1], they will not be reversed.
* @return {Object} obj * @return {Object} obj
*/ */
_getRangeInfo: function (range) { _getRangeInfo: function (range) {
range = [
this.getDateInfo(range[0]),
this.getDateInfo(range[1])
];
var start = this.getDateInfo(range[0]); var reversed;
var end = this.getDateInfo(range[1]); if (range[0].time > range[1].time) {
reversed = true;
range.reverse();
}
var allDay = Math.floor(end.time / ONE_DAY) - Math.floor(start.time / ONE_DAY) + 1; var allDay = Math.floor(range[1].time / PROXIMATE_ONE_DAY)
- Math.floor(range[0].time / PROXIMATE_ONE_DAY) + 1;
// Consider case:
// Firstly set system timezone as "Time Zone: America/Toronto",
// ```
// var first = new Date(1478412000000 - 3600 * 1000 * 2.5);
// var second = new Date(1478412000000);
// var allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1;
// ```
// will get wrong result because of DST. So we should fix it.
var date = new Date(range[0].time);
var startDateNum = date.getDate();
var endDateNum = range[1].date.getDate();
date.setDate(startDateNum + allDay - 1);
// The bias can not over a month, so just compare date.
if (date.getDate() !== endDateNum) {
var sign = date.getTime() - range[1].time > 0 ? 1 : -1;
while (date.getDate() !== endDateNum && (date.getTime() - range[1].time) * sign > 0) {
allDay -= sign;
date.setDate(startDateNum + allDay - 1);
}
}
var weeks = Math.floor((allDay + range[0].day + 6) / 7);
var nthWeek = reversed ? -weeks + 1: weeks - 1;
var weeks = Math.floor((allDay + start.day + 6) / 7); reversed && range.reverse();
return { return {
range: [start.formatedDate, end.formatedDate], range: [range[0].formatedDate, range[1].formatedDate],
start: start, start: range[0],
end: end, end: range[1],
allDay: allDay, allDay: allDay,
weeks: weeks, weeks: weeks,
fweek: start.day, // From 0.
lweek: end.day nthWeek: nthWeek,
fweek: range[0].day,
lweek: range[1].day
}; };
}, },
...@@ -370,11 +415,10 @@ define(function (require) { ...@@ -370,11 +415,10 @@ define(function (require) {
} }
var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day;
var date = new Date(rangeInfo.start.time);
date.setDate(rangeInfo.start.d + nthDay);
var time = rangeInfo.start.time + nthDay * ONE_DAY; return this.getDateInfo(date);
return this.getDateInfo(time);
} }
}; };
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
height: 100%; height: 100%;
} }
</style> </style>
<h2>Test: set system timezone as "Time Zone: America/Toronto", everything should be correct.</h2>
<div id="main"></div> <div id="main"></div>
<script> <script>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册