You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by su...@apache.org on 2020/04/21 06:34:39 UTC

[incubator-echarts] branch master updated: fix: calendar timezone bug in DST. Fix #12172. And add test cases.

This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/master by this push:
     new 878829b  fix: calendar timezone bug in DST. Fix #12172. And add test cases.
878829b is described below

commit 878829b46c4273b8a6793685b83bcecdb5313f8e
Author: 100pah <su...@gmail.com>
AuthorDate: Mon Apr 20 16:59:30 2020 -0400

    fix: calendar timezone bug in DST. Fix #12172. And add test cases.
---
 src/coord/calendar/Calendar.js |  19 +++--
 test/calendar-timezone.html    | 173 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 186 insertions(+), 6 deletions(-)

diff --git a/src/coord/calendar/Calendar.js b/src/coord/calendar/Calendar.js
index e397c0b..cf77e70 100644
--- a/src/coord/calendar/Calendar.js
+++ b/src/coord/calendar/Calendar.js
@@ -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);
@@ -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);
             }
         }
 
diff --git a/test/calendar-timezone.html b/test/calendar-timezone.html
new file mode 100644
index 0000000..ede1b35
--- /dev/null
+++ b/test/calendar-timezone.html
@@ -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>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org