Skip to content

Commit

Permalink
fix: calendar timezone bug in DST. Fix #12172. And add test cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
100pah committed Apr 21, 2020
1 parent 0c1b295 commit 878829b
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 6 deletions.
19 changes: 13 additions & 6 deletions src/coord/calendar/Calendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -372,10 +372,13 @@ Calendar.prototype = {
range.reverse();
}

var allDay =
Math.round((range[1].time - range[0].time) / PROXIMATE_ONE_DAY) + 1;
var allDay = Math.floor(range[1].time / PROXIMATE_ONE_DAY)
- Math.floor(range[0].time / PROXIMATE_ONE_DAY) + 1;

// Consider case:
// Consider case1 (#11677 #10430):
// Set the system timezone as "UK", set the range to `['2016-07-01', '2016-12-31']`

// Consider case2:
// Firstly set system timezone as "Time Zone: America/Toronto",
// ```
// var first = new Date(1478412000000 - 3600 * 1000 * 2.5);
Expand All @@ -388,11 +391,15 @@ Calendar.prototype = {
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 dateNum = date.getDate();
if (dateNum !== endDateNum) {
var sign = date.getTime() - range[1].time > 0 ? 1 : -1;
while (date.getDate() !== endDateNum && (date.getTime() - range[1].time) * sign > 0) {
while (
(dateNum = date.getDate()) !== endDateNum
&& (date.getTime() - range[1].time) * sign > 0
) {
allDay -= sign;
date.setDate(startDateNum + allDay - 1);
date.setDate(dateNum - sign);
}
}

Expand Down
173 changes: 173 additions & 0 deletions test/calendar-timezone.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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, 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.
-->


<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="lib/esl.js"></script>
<script src="lib/config.js"></script>
<script src="lib/jquery.min.js"></script>
<script src="lib/facePrint.js"></script>
<script src="lib/testHelper.js"></script>
<!-- <script src="ut/lib/canteen.js"></script> -->
<link rel="stylesheet" href="lib/reset.css" />
</head>
<body>
<style>
</style>



<div id="main0"></div>
<div id="main1"></div>
<div id="main2"></div>









<script>
var getVirtulData = function(year) {

year = year || '2017';

var datas = [];

var arr31 = [1, 3, 5, 7, 8, 10, 12];
var arr30 = [4, 6, 9, 11];
for (var i = 1; i <= 31; i++) {
for (var j = arr31.length - 1; j >= 0; j--) {
datas.push([year + '-' + arr31[j] + '-' + i, Math.floor(Math.random() * 1000)]);
}
}
for (var i = 1; i <= 30; i++) {
for (var j = arr30.length - 1; j >= 0; j--) {
datas.push([year + '-' + arr30[j] + '-' + i, Math.floor(Math.random() * 1000)]);
}
}
for (var i = 1; i <= 29; i++) {
datas.push([year + '-2-' + i, Math.floor(Math.random() * 1000)]);
}
return datas;
}
</script>



<script>
require(['echarts'/*, 'map/js/china' */], function (echarts) {
var option;

// From #11677
option = {
tooltip: {
position: 'top'
},
visualMap: {
type: 'piecewise',
min: 0,
max: 1000,
seriesIndex: 0,
calculable: true,
orient: 'horizontal',
left: 'center',
top: 500
},
calendar: [{
range: ['2016-07-01', '2016-12-31']
}],
series: [{
type: 'heatmap',
calendarIndex: 0,
coordinateSystem: 'calendar',
data: getVirtulData(2017)
}]
};

var chart = testHelper.create(echarts, 'main0', {
title: [
'Set the system timezone to **UK**',
'the calendar coord sys should be correct'
],
option: option
});
});
</script>




<script>
require(['echarts'/*, 'map/js/china' */], function (echarts) {
var option;

// From #10430
option = {
tooltip: {
position: 'top'
},
visualMap: {
type: 'piecewise',
min: 0,
max: 1000,
seriesIndex: 0,
calculable: true,
orient: 'horizontal',
left: 'center',
top: 500
},
calendar: [{
cellSize: ['auto', 13],
range: '2016-10',
itemStyle: {
normal: {borderWidth: 0.5}
},
yearLabel: {show: false}
}],
series: [{
type: 'heatmap',
calendarIndex: 0,
coordinateSystem: 'calendar',
data: getVirtulData(2017)
}]
};

var chart = testHelper.create(echarts, 'main1', {
title: [
'Set the system timezone to **UK**',
'the calendar coord sys should be correct (like a inverted Z)'
],
option: option
});
});
</script>




</body>
</html>

0 comments on commit 878829b

Please sign in to comment.